目录
帮女朋友(玲儿)处理数据时写的表格数据翻译代码哈哈(可以实现多个excel同时翻译,而且不限制字符数量)
第一节:导入库并设置 API 凭证
本部分包括导入所需的库并设置翻译 API 的凭据。导入的库concurrent.futures用于并发执行、tqdm进度条可视化、pandas数据操作、requests发出 HTTP 请求、jsonJSON 处理、os操作系统相关功能、hashlib生成 MD5 哈希以及random生成随机数。API 凭证appid和secret_key需要填写适当的值。
from concurrent.futures import ThreadPoolExecutor, as_completed
from tqdm import tqdm
import pandas as pd
import requests
import json
import os
import hashlib
import random
import time
第二节:翻译功能
本节定义了Translate函数,该函数接受要翻译的文本以及源语言和目标语言。它使用百度翻译 API 来执行翻译。该函数生成随机 salt 值,使用提供的 appid、text、salt 和 Secret_key 计算符号,并向翻译 API 发送 GET 请求。然后解析响应,并返回翻译后的文本。
def Translate(sText, from_lang='en', to_lang='zh'):
appid = '' # 改的第一个地方,自己的API唔
secret_key = ''
url = 'https://fanyi-api.baidu.com/api/trans/vip/translate'
salt = random.randint(32768, 65536)
sign = hashlib.md5((appid + sText + str(salt) + secret_key).encode()).hexdigest()
params = {
'q': sText,
'from': from_lang,
'to': to_lang,
'appid': appid,
'salt': salt,
'sign': sign
}
response = requests.get(url, params=params)
result = json.loads(response.content.decode())
if result.get('error_code') is not None:
return None
return result['trans_result'][0]['dst']
第三节:文本翻译功能
本节定义了该TranslateText函数,该函数将文本作为输入并将其分割成更小的块以符合 API 的最大字符限制。它调用Translate每个块的函数并收集翻译。在请求之间添加 1 秒的延迟,以遵守 API 的速率限制。该函数返回串联的翻译。
def TranslateText(text):
max_length = 5000 # 每个请求的最大字符数
text_length = len(text)
translations = []
for i in range(0, text_length, max_length):
sub_text = text[i:i + max_length]
translation = Translate(sub_text)
translations.append(translation if translation is not None else '')
time.sleep(1) # 添加延迟,遵守百度翻译API的访问频率限制
return ''.join(translations)
第四节:表翻译功能
本节定义了TranslateTable函数,该函数采用输入文件名和输出文件名。它使用列读取 Excel 文件pd.read_excel并对其进行迭代。对于每一列(“翻译”列除外),它应用该TranslateText函数来翻译该列中的文本。翻译结果存储在附加“_翻译”(翻译)后缀的新列中。最后,将翻译后的DataFrame保存为Excel文件。
def TranslateTable(sInputFilename, sOutputFilename):
df_a = pd.read_excel(sInputFilename)
for col in df_a.columns:
if col != '原文':
df_a[col + '_翻译'] = df_a[col].apply(lambda x: TranslateText(str(x)) if isinstance(x, str) else '')
df_a.to_excel(sOutputFilename, index=False)
return df_a
第五节:文件夹翻译功能
本节定义了该TranslateTables函数,该函数采用输入文件夹和输出文件夹。它从输入文件夹中检索输入文件名列表,过滤扩展名为“.xlsx”的文件。使用 a ThreadPoolExecutor,它为每个输入文件提交要同时执行的翻译任务。输出文件以“_翻译结果.xlsx”后缀保存在输出文件夹中。使用跟踪任务的进度tqdm,完成后会打印一条消息,指示所有输出均已生成。
def TranslateTables(sInputFolder, sOutputFolder):
sInputFilenames = [os.path.join(sInputFolder, f) for f in os.listdir(sInputFolder) if f.endswith('.xlsx')]
with ThreadPoolExecutor() as executor:
lstFutures = []
for sInputFilename in sInputFilenames:
sFilename = os.path.splitext(os.path.basename(sInputFilename))[0]
sOutputFilename = os.path.join(sOutputFolder, sFilename + '_翻译结果.xlsx')
lstFutures.append(executor.submit(TranslateTable, sInputFilename, sOutputFilename))
for future in tqdm(as_completed(lstFutures), total=len(lstFutures)):
df_result = future.result()
print(f'已经全部输出完成啦!!!')
sInputFolder = r'C:\Users\aa\Desktop\cc' # 改的第二个地方,文件夹位置唔
sOutputFolder = r'C:\Users\aa\Desktop\bb' # 改的第二个地方
TranslateTables(sInputFolder, sOutputFolder)
第五节:代码总结
功能:
该程序使用百度翻译 API 将文本从一种语言翻译成另一种语言。
它支持批量翻译指定输入文件夹内的多个Excel文件。
它将文本分割成更小的块以符合 API 的字符限制,并单独处理每个块的翻译。
该程序将翻译结果添加为 Excel 文件中的新列,并将其保存在指定的输出文件夹中。
它使用多线程来ThreadPoolExecutor并发执行翻译任务,通过利用多个线程来提高性能。
优点:
易于使用:该程序提供了一种简单的方法来翻译 Excel 文件中的文本,而无需广泛的编码知识。
批处理:该程序支持批处理,允许用户一次性翻译多个Excel文件。
并发执行:通过利用多线程,程序可以同时执行多个翻译,从而提高效率并减少总体执行时间。
进度跟踪:该tqdm库提供进度条,使用户可以了解翻译进度并估计剩余时间。
错误处理:程序处理翻译 API 返回的错误,并确保任何未翻译的文本都被替换为空字符串。
灵活性:该程序允许用户指定源语言和目标语言,使其适应各种翻译需求。
总体而言,该程序提供了一种使用百度翻译 API 翻译 Excel 文件中的文本的便捷高效的方法,它可以自动执行多个文件的翻译过程,并通过利用并发执行来提高生产力。
第六节:百度翻译API申请流程
网站:百度翻译开放平台
在里面可以免费申请高级版API,然后启用通用文档翻译API如下(注意:每人每月免费100万字符上限),在右侧总览功能底部可以找到APP ID和密钥,放入程序使用即可:
重点:完整程序如下
from concurrent.futures import ThreadPoolExecutor, as_completed
from tqdm import tqdm
import pandas as pd
import requests
import json
import os
import hashlib
import random
import time
def Translate(sText, from_lang='en', to_lang='zh'):
appid = '' # 改的第一个地方,自己的百度翻译API唔
secret_key = ''
url = 'https://fanyi-api.baidu.com/api/trans/vip/translate'
salt = random.randint(32768, 65536)
sign = hashlib.md5((appid + sText + str(salt) + secret_key).encode()).hexdigest()
params = {
'q': sText,
'from': from_lang,
'to': to_lang,
'appid': appid,
'salt': salt,
'sign': sign
}
response = requests.get(url, params=params)
result = json.loads(response.content.decode())
if result.get('error_code') is not None:
return None
return result['trans_result'][0]['dst']
def TranslateText(text):
max_length = 5000 # 每个请求的最大字符数
text_length = len(text)
translations = []
for i in range(0, text_length, max_length):
sub_text = text[i:i + max_length]
translation = Translate(sub_text)
translations.append(translation if translation is not None else '')
time.sleep(1) # 添加延迟,遵守百度翻译API的访问频率限制
return ''.join(translations)
def TranslateTable(sInputFilename, sOutputFilename):
df_a = pd.read_excel(sInputFilename)
for col in df_a.columns:
if col != '原文':
df_a[col + '_翻译'] = df_a[col].apply(lambda x: TranslateText(str(x)) if isinstance(x, str) else '')
df_a.to_excel(sOutputFilename, index=False)
return df_a
def TranslateTables(sInputFolder, sOutputFolder):
sInputFilenames = [os.path.join(sInputFolder, f) for f in os.listdir(sInputFolder) if f.endswith('.xlsx')]
with ThreadPoolExecutor() as executor:
lstFutures = []
for sInputFilename in sInputFilenames:
sFilename = os.path.splitext(os.path.basename(sInputFilename))[0]
sOutputFilename = os.path.join(sOutputFolder, sFilename + '_翻译结果.xlsx')
lstFutures.append(executor.submit(TranslateTable, sInputFilename, sOutputFilename))
for future in tqdm(as_completed(lstFutures), total=len(lstFutures)):
df_result = future.result()
print(f'已经全部输出完成啦!!!')
sInputFolder = r'C:\Users\aa\Desktop\cc' # 改的第二个地方,文件夹位置,是文件夹位置哈
sOutputFolder = r'C:\Users\aa\Desktop\bb' # 改的第二个地方
TranslateTables(sInputFolder, sOutputFolder)
如有不足,欢迎留言指正哈