python批量翻译excel表格中的英文
作者:松哥真的一米九 发布时间:2022-11-16 08:09:07
需求背景
女朋友的论文需要爬取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)
来源:https://blog.csdn.net/weixin_44146046/article/details/129103372
猜你喜欢
- 原始数据在这里1.观察数据首先,用Pandas打开数据,并进行观察。import numpy import pandas as pdimpo
- 本文介绍了一些JavaScript常用到得表单验证函数,方便大家使用。 判断是否为整数,是则返回true,否则返回falsefun
- 安装官网下载http://ffmpeg.org/选择需要的版本在这个网址下载ffmpeg,https://github.com/BtbN/F
- 本文分析了让ThinkPHP的模板引擎达到最佳效率的方法。分享给大家供大家参考,具体如下:默认情况下ThinkPHP框架系统默认使用的模板引
- <style> #L { position:absolute; color:
- PyQt中MainWindow, QWidget以及Dialog的区别和选择1. Qt界面分类在Qt Designer设计界面时,首先需要选
- 如题在SQL中 SELECT ... FROM ... ORDER BY abc ASC; 如果abc是字符串,那么结果会按照a-z 中文按
- 在SQL Server 2008 中,新的FILESTREAM 数据类型,允许像文件和图片这种大型的二进制数据可以直接在NTFS文件系统中进
- 本文实例讲述了php利用cookies实现购物车的方法。分享给大家供大家参考。具体分析如下:php购物车是在电子商务网站会用到的,一种像超市
- 前言在《设计模式》一书中工厂模式提到了:工厂方法模式(Factory Method)抽象工厂模式 (Abstract Factory)但是在
- 也许已经有人发现可以这样写...CSS代码部分a.info { position:
- 概述做日志分析工作的经常需要跟成千上万的日志条目打交道,为了在庞大的数据量中找到特定模式的数据,常常需要编写很多复杂的正则表达式。例如枚举出
- 所谓线性最小二乘法,可以理解为是解方程的延续,区别在于,当未知量远小于方程数的时候,将得到一个无解的问题。最小二乘法的实质,是保证误差最小的
- 我们现在使用的验证手段都是以验证码为主,让用户根据图片输入验证字符,这种方法的安全度尚可,但会给用户带来一些不便和困扰,比如这个雅虎的验证码
- 如题,首先读取视频路径,其次根据视频名称创建对应的文件夹,再逐帧将视频帧读入。import cv2import argparseimport
- function f(x){ alert(x); return
- 在实际的应用中,Access做应用程序时,经常会做成"数据"和"程序"两个数据库,"数据&
- 在Bootstrap的官网上,提供了一种导航栏的组件:只要在站点文件夹放好JQ与Bootstrap输入如下代码: <!DOCTYPE
- “正则表达式”对象,我们就可以非常方便的对各种数据进行合法性的校验了。首先,让我们来了解一下究竟什么
- 类似于and操作类似于or操作# 类型转换# sortedli=[2,45,1,67,23,10]li.sort() #list的排序方法p