python批量翻译excel表格中的英文_世界微动态
(相关资料图)
目录
需求背景主要设计分析具体实现表格操作请求百度翻译api多线程控制台显示进度完整源码需求背景
女朋友的论文需要爬取YouTube视频热评,但爬下来的都是外文。
主要设计
读取一个表格文件,获取需要翻译的文本使用百度翻译 API 进行翻译,获取翻译结果将翻译结果保存到原表格中,然后提取需要的列组成一个新的 DataFrame处理多个表格文件,将它们的翻译结果分别保存使用线程池加速翻译过程,可以同时翻译多个表格显示进度条分析
目标文件为xlsx格式,可以借助pandas进行读取文件和生成文件的操作。在这里我的源文件有若干列,其中第2列评论内容为我的目标列。在这里我用的是百度翻译api接口。也可以googletrans、translate,这些库可以在本地使用,不需要申请API密钥,但是翻译质量和速度可能不如云服务。由于我每个表格有2000行数据,总共有10个表格,一个个来的话不仅麻烦效率还低。我需要知道任务的进度,不想一直等下去具体实现
表格操作
def TranslateTable(sInputFilename, sOutputFilename): # 读取表格A并选择需要翻译的列 df_a = pd.read_excel(sInputFilename) # 获取df对象 df_a = df_a.iloc[:, [1, 2]] # iloc和loc很像,i=index, # 翻译英文列 df_a["translation"] = df_a.iloc[:, 0].apply(Translate) # 创建表格B并保存 df_b = pd.DataFrame({ "原文": df_a.iloc[:, 0], "译文": df_a.iloc[:, 2] }) df_b.to_excel(sOutputFilename, index=False)
请求百度翻译api
def Translate(sText, from_lang="en", to_lang="zh"): appid = "xxxxxx" secret_key = "xxxxxx" 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"]
多线程
使用concurrent.futures库中的 ThreadPoolExecutor类来实现多线程处理。
创建一个 ThreadPoolExecutor对象。在循环中遍历每个表格A,并使用 submit方法向线程池提交任务。 submit方法将表格A的文件名和表格B的文件名作为参数传递给 translate_column函数,该函数将在单独的线程中执行。ThreadPoolExecutor会自动管理线程池的大小,并在有空闲线程时分配新任务。这种方式可以利用多个CPU核心来并行处理多个表格,提高处理速度。
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)): pass
控制台显示进度
使用 concurrent.futures.as_completed 函数显示进度条。
完整源码
# -*- coding: utf-8 -*- # time: 2022/2/17 03:06 # file: test.py # author: Shi Yasong """ 主要功能功能: 1、读取一个表格文件,获取需要翻译的文本。 2、使用百度翻译 API 进行翻译,获取翻译结果。 3、将翻译结果保存到原表格中,然后提取需要的列组成一个新的 DataFrame。 4、处理多个表格文件,将它们的翻译结果合并到一个 DataFrame 中,然后分别保存。 5、使用线程池加速翻译过程,可以同时翻译多个表格 6、使用 concurrent.futures.as_completed 函数显示进度条。 """ 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 def Translate(sText, from_lang="en", to_lang="zh"): appid = "xxxx" secret_key = "xxxxx" 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 TranslateTable(sInputFilename, sOutputFilename): # 读取表格A并选择需要翻译的列 df_a = pd.read_excel(sInputFilename) # 获取df对象 df_a = df_a.iloc[:, [1, 2]] # iloc和loc很像,i=index, # 翻译英文列 df_a["translation"] = df_a.iloc[:, 0].apply(Translate) # 创建表格B并保存 df_b = pd.DataFrame({ "原文": df_a.iloc[:, 0], "译文": df_a.iloc[:, 2] }) df_b.to_excel(sOutputFilename, index=False) 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)): pass # 调用函数翻译多个表格 sInputFolder = r"C:\Users\lenovo\Desktop\english" # 修改为实际的表格文件夹路径 sOutputFolder = r"C:\Users\lenovo\Desktop\zh" # 修改为实际的表格文件夹路径 TranslateTables(sInputFolder, sOutputFolder)
到此这篇关于python批量翻译excel表格中的英文的文章就介绍到这了,更多相关python批量翻译内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
X 关闭
X 关闭
- 15G资费不大降!三大运营商谁提供的5G网速最快?中国信通院给出答案
- 2联想拯救者Y70发布最新预告:售价2970元起 迄今最便宜的骁龙8+旗舰
- 3亚马逊开始大规模推广掌纹支付技术 顾客可使用“挥手付”结账
- 4现代和起亚上半年出口20万辆新能源汽车同比增长30.6%
- 5如何让居民5分钟使用到各种设施?沙特“线性城市”来了
- 6AMD实现连续8个季度的增长 季度营收首次突破60亿美元利润更是翻倍
- 7转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 8充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 9好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 10名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?