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 IDLE1.1 IDLE是python创初人Guido van Rossum使用python and Tkinter来创建的一个集成开发
- 一.脚本基础1.USE语句设置当前数据库。2.声明变量语法:DECLARE @变量名 变量类型在声明变量后,给变量赋值之前,变量的值为NUL
- 问题描述??输入一个正整数n在n*n的方阵内填入1,2,3,4…n*n,要求填成蛇形。(回旋的向中间收敛)样例输入:4样例输出:不必严格按照
- 一、线程队列queue队列:使用方法同进程的Queue一样如果必须在多个线程之间安全地交换信息时,队列在线程编程中尤其有用。重要:q.put
- 一:工具准备Anaconda:是一个开源的Python发行版本,其中包含了conda、Python等180多个科学包及其依赖项。【Anaco
- 其实 Oracle数据库的分页还是比较容易理解的。此文以oracle数据库中的SCOTT用户的EMP表为例,用PL/SQL Develope
- 图片提取为了方便技术展示,我们选取素材为演员杨紫的一段演讲视频,用例仅为技术交流演示使用,不针对任何指定人。为达到我们AI换脸的目的,我们首
- 先来看一个老掉牙的故事:福特说,我在设计汽车之前,到处去问人们“需要一个什么样的更好的交通工具?”,几乎所有人的答案都是 ── 一匹“更快的
- function f(x){ alert(x); return
- 并发安全和锁有时候在Go代码中可能会存在多个goroutine同时操作一个资源(临界区),这种情况会发生竞态问题(数据竞态)。类比现实生活中
- 以下是关于小编给大家日常收集整理php正则表达式,具体内容请看下文详解吧$str = preg_replace("/(<a.
- 话不多说,直接上代码吧!import numpy as npA = np.delete(A, 1, 0) # 删除A的第二行B = np.d
- 1. 列表1.1 列表的定义List(列表) 是Python 中使用最频繁的数据类型,在其他语言中通常叫做数组专门用于存储一串 信息列表用[
- 导包效果展示以下截图显示的撤回消息类型依次是文字消息、微信自带表情、图片、语音、定位地图、名片、公众号文章、音乐、视频。有群里撤回的,也有个
- 1.常用数据结构之列表我们先给大家一个编程任务,将一颗色子掷6000次,统计每个点数出现的次数。这个任务对大家来说应该是非常简单的,我们可以
- 介绍获取协程返回值的四种方式:1、通过ensure_future获取,本质是future对象中的result方2、使用loop自带的crea
- 本文实例为大家分享了python tornado微信开发的具体代码,供大家参考,具体内容如下#微信入门代码#!/usr/bin/env py
- NumPy是一个Python语言的软件包,它非常适合于科学计算。在我们使用Python语言进行机器学习编程的时候,这是一个非常常用的基础库。
- LoadRunner监控MySQLhttp://www.docin.com/p-92272846.htmlAdvanced MySQL Pe
- python如何处理“&#”开头加数字的html字符,比如:风水这类数据。用python