Python调用百度翻译接口,批量翻译Office、JSON和MySQL数据

申请 API 密钥

第一步,打开 百度翻译开放平台 的官网,注册一个百度账号。
第二步进入管理控制台,选择开发者中心 - 开发者信息,在基本信息下,完成个人认证。

第三步创建 API,选择开发者中心 - API Key 管理,创建 API。

用 Python 调这个接口

核心就是写一个 translate 函数:生成随机数,拼接字符串,做 MD5,发 GET 请求,检查 trans_result。代码在下面。

import requests

import hashlib

import random

import os

import time

# 从环境变量读取,避免密钥写死在代码里

APP_ID = os.environ.get("BAIDU_APP_ID", "你的APP_ID")

SECRET_KEY = os.environ.get("BAIDU_SECRET_KEY", "你的密钥")

def translate(text, from_lang="auto", to_lang="en"):

"""

调用百度翻译接口翻译一段文字。

text: 要翻译的字符串

from_lang: 源语言代码,auto 表示自动检测

to_lang: 目标语言代码,如 en、jp、fra

返回: 翻译后的字符串,失败则返回 None

"""

url = "https://fanyi-api.baidu.com/api/trans/vip/translate"

# 已认证高级版每秒最多 10 次,所以每次请求前等 0.1 秒

time.sleep(0.1)

# 生成随机数,防止请求被缓存

salt = str(random.randint(32768, 65536))

# 按百度要求的顺序拼接字符串,再做 MD5

sign_str = APP_ID + text + salt + SECRET_KEY

sign = hashlib.md5(sign_str.encode("utf-8")).hexdigest()

# 组装请求参数

params = {

"q": text,

"from": from_lang,

"to": to_lang,

"appid": APP_ID,

"salt": salt,

"sign": sign

}

# 发送 GET 请求

response = requests.get(url, params=params, timeout=10)

result = response.json()

# 检查返回结果

if "trans_result" in result:

# 百度返回的是一个列表,每个元素是一条翻译结果

return result["trans_result"][0]["dst"]

else:

# 打印错误信息,方便排查

print(f"翻译失败:{result}")

return None

怎么选翻译的语言

百度翻译用简短代码表示语言,常用的有:zh 中文、en 英语、jp 日语、kor 韩语、fra 法语、spa 西班牙语、de 德语、ru 俄语,auto 表示自动检测源语言。调用时换 from_lang 和 to_lang 就行,中文翻英文是 translate(text, from_lang="zh", to_lang="en"),英文翻日语是 translate(text, from_lang="en", to_lang="jp")。百度翻译支持的语种比较多,完整列表可以查官方文档,这里只列了日常最常用的几个。

翻译 Office 文件

Office 文件分三种:Word、Excel、PowerPoint。Python 各有对应的库可以读写。这三种文件结构不同,处理方式也不一样。
Word 文档我用 python-docx。文字分散在段落和表格里,需要一个个看所有段落,把每段文字送去翻译,再把译文写回原位置。

from docx import Document

def translate_word(input_path, output_path, to_lang="en"):

"""

翻译 Word 文档中的所有段落和表格文字。

input_path: 源文件路径

output_path: 翻译后的文件保存路径

to_lang: 目标语言

"""

doc = Document(input_path)

# 遍历所有段落,跳过空段落

for para in doc.paragraphs:

if para.text.strip():

translated = translate(para.text, to_lang=to_lang)

if translated:

# 清空原段落,写入译文

para.clear()

para.add_run(translated)

# 遍历所有表格,翻译每个单元格

for table in doc.tables:

for row in table.rows:

for cell in row.cells:

if cell.text.strip():

translated = translate(cell.text, to_lang=to_lang)

if translated:

cell.text = translated

doc.save(output_path)

print(f"翻译完成:{output_path}")

Excel 我用 openpyxl。核心是单元格,需要一个个看每一个有值的单元格,翻译后再写回去。

import openpyxl

def translate_excel(input_path, output_path, to_lang="en"):

"""

翻译 Excel 文件中所有单元格的文字。

只翻译文本类型的单元格,数字和公式不动。

"""

wb = openpyxl.load_workbook(input_path)

# 遍历每一个工作表

for sheet in wb.worksheets:

# 遍历所有行和单元格

for row in sheet.iter_rows():

for cell in row:

# 只处理字符串内容,跳过数字、日期等

if cell.value and isinstance(cell.value, str):

translated = translate(cell.value, to_lang=to_lang)

if translated:

cell.value = translated

wb.save(output_path)

print(f"翻译完成:{output_path}")

PowerPoint 我用 python-pptx。文字分布在每一页的文本框和形状里,需要一层层看过去。

from pptx import Presentation

def translate_ppt(input_path, output_path, to_lang="en"):

"""

翻译 PowerPoint 中所有文本框的文字。

遍历每一页幻灯片,再遍历每个形状里的文本框。

"""

prs = Presentation(input_path)

for slide in prs.slides:

for shape in slide.shapes:

# 检查这个形状是否有文本框

if shape.has_text_frame:

for para in shape.text_frame.paragraphs:

if para.text.strip():

translated = translate(para.text, to_lang=to_lang)

if translated:

# 直接替换整段文字

para.text = translated

prs.save(output_path)

print(f"翻译完成:{output_path}")

把这三个函数组合起来,再加一个根据文件后缀判断类型的逻辑,程序就能批量处理一个文件夹里的所有 Office 文件。

翻译 JSON 文件

JSON 的结构是嵌套的:一个键对应的值可能是字符串,也可能是对象,对象里还有键值对。我用递归函数把所有字符串值找出来,翻译完再放回去。
递归的逻辑是:遇到字典就遍历它的值,遇到列表就遍历它的元素,遇到字符串就翻译它,遇到其他类型就原样返回。这个递归函数不管 JSON 嵌套多深,都能处理到。

import json

def translate_json_value(obj, to_lang="en"):

"""

递归遍历 JSON 数据,翻译所有字符串值。

字典、列表、字符串都分别处理。

非字符串类型(数字、布尔、null)原样返回。

"""

if isinstance(obj, dict):

# 如果是字典,遍历每个键值对

return {key: translate_json_value(value, to_lang) for key, value in obj.items()}

elif isinstance(obj, list):

# 如果是列表,遍历每个元素

return [translate_json_value(item, to_lang) for item in obj]

elif isinstance(obj, str):

# 如果是字符串,翻译它

if obj.strip():

translated = translate(obj, to_lang=to_lang)

return translated if translated else obj

return obj

else:

# 数字、布尔、null 直接返回

return obj

def translate_json_file(input_path, output_path, to_lang="en"):

"""

读取 JSON 文件,翻译所有字符串值,写入新文件。

"""

with open(input_path, "r", encoding="utf-8") as f:

data = json.load(f)

translated_data = translate_json_value(data, to_lang)

with open(output_path, "w", encoding="utf-8") as f:

# ensure_ascii=False 保证中文正常显示,不转成 \uXXXX

json.dump(translated_data, f, ensure_ascii=False, indent=2)

print(f"翻译完成:{output_path}")

翻译 MySQL 数据库里的字段

数据库的场景和文件不一样。文件是整体的,数据库是一行一行的。需要连接数据库,查出要翻译的内容,翻译完再写回去。先装依赖:pip install pymysql requests。
这段逻辑很直接:先查出来,再翻译,再更新。连接时要用 charset="utf8mb4",否则数据库可能存不进中文和 emoji。表名和列名用反引号包裹,防止和 SQL 关键字冲突。

import pymysql

def translate_mysql_table(host, user, password, db_name, table_name, column_name, to_lang="en"):

"""

翻译 MySQL 表中某一列的所有文本值。

host/user/password/db_name: 数据库连接信息

table_name: 要翻译的表名

column_name: 要翻译的列名

to_lang: 目标语言

"""

# 连接数据库

conn = pymysql.connect(

host=host, user=user, password=password,

db=db_name, charset="utf8mb4"

)

cursor = conn.cursor()

# 查出所有非空值,带上主键 id 方便后续更新

sql_select = f"SELECT id, `{column_name}` FROM `{table_name}` WHERE `{column_name}` IS NOT NULL AND `{column_name}` != ''"

cursor.execute(sql_select)

rows = cursor.fetchall()

print(f"共找到 {len(rows)} 条待翻译记录")

# 逐条翻译并更新

for row_id, original_text in rows:

translated = translate(original_text, to_lang=to_lang)

if translated:

sql_update = f"UPDATE `{table_name}` SET `{column_name}` = %s WHERE id = %s"

cursor.execute(sql_update, (translated, row_id))

# 提交所有修改

conn.commit()

cursor.close()

conn.close()

print("翻译完成")

上一篇 图片压缩网站推荐,这 6 个网站最值得收藏