首页 > 编程知识 正文

excel怎么批量把英文翻译成中文,excel自动翻译成英文

时间:2023-05-05 09:22:18 阅读:264400 作者:4368

目录 操作过程中不断遇到新的问题,思路的转换过程背景第一天 操作过程第二天正则表达式是个好东西 第三天第四天第五天遇到的小问题

操作过程中不断遇到新的问题,思路的转换过程 背景

今天接到一个任务,需要将EXCEL文件中的中文翻译成英文,由于表格内容非常大,我想着 这要是手动翻译,三天啥都不用干了,就翻译这个吧
于是有了用python批量翻译的想法
目前的思路是,将excel中每个单元的内容拿出来,放在一个列表中,然后用翻译软件翻译再批量存入新的表格(应该可以用API接口,将所有单元内容依次拿出、翻译、存入,这个还没学会。。。)
参考文章:pandas操作

第一天 操作过程

1.发现一个问题,google翻译有字数上限。。。一次最多5000字符
于是想到分几步粘贴,需要翻译的表格差不多两万多。自己多动几次手就好了。
好,终于翻译完了,开始运行

新问题来了,谷歌在翻译的大段字符的时候,把有的引号 ‘’ 给吞了,这就造成了列表中间的元素发生了紊乱,这个就比较麻烦了,刚开始尝试手动修改,把吞掉的引号给他补上,手动操作5分钟之后,我放弃了,这尼玛也太坑了。就在我准备砸电脑放弃的时候,突然灵光一闪,想到可以用正则表达式批量计算啊,简直不要太机智

import pandas as pdpath = r'C:UsershaoDesktop批量翻译源文件两广-住宅调研问卷.xlsx'df = pd.read_excel(path, header=None)contents = []for i in range(len(df[0])):for j in range(len(df.iloc[0])):content = df.iloc[i,j]print('第{}行第{}列元素:%s'.format(i, j)%content)contents.append(content)print('行和列的长度:%d,%d'%(len(df[0]), len(df.iloc[0])))print(contents) 第二天 正则表达式是个好东西

正则表达式常见操作
先导入所有翻译好的数据

在编译器的提示下,可以很明显地看出出现错误的地方(白色就代表出错了),英文里面所有格 's中会带来引号,与列表中的引号发生了冲突,于是想到用正则把其他的引号改为双引号,

然后把开头和结尾的单引号也改为双引号,但依然提示错误。。。发现是由于数字不是字符串没有引号,没有被正则匹配上,于是又回去修改代码,把int和float型加上引号,再接着运行,发现还是有错误,中间有些空白字符被吞了,就导致后面的整个秩序对不上,导入到表格中发生错位。。。最后就放弃用正则修改了。。。

第三天

既然批量提取,翻译之后再批量导入的方法行不通,就只能试一试之前想到的API了,提取一个,翻译一个,这样就不会错位了,说干就干,百度了一个方法,代码如下

#利用translate模块,但有两个缺点,一个是限制翻译数量,每天就能翻译1000个词#再一个是只能由英文翻译成中文,比较瓜import pandas as pdfrom translate import Translatorpath = r'C:UsershaoDesktop批量翻译源文件test_db1.xlsx'df = pd.read_excel(path, header=None)#content_1, content_2, content_2, content_2, for i in range(len(df[0])): #df[0]表示提取第一列for j in range(len(df.iloc[0])): #df.iloc[0]表示提取第一行#print(str(df.iloc[i,j]))translator = Translator(to_lang="zh")translation = translator.translate(df.iloc[i,j])print(translation)df.iloc[i,j] = translationdf.to_excel(r'C:UsershaoDesktop批量翻译结果EtoC.xlsx', index=False) 第四天

既然谷歌提供的API只让翻译1000个词,我就在翻译界面看了一下页面源码

发现,源码上有直接的翻译结果的,那我干脆自己直接用爬虫抓取得了,还要他的API干嘛,talk is cheap,show me the code

#自己利用爬虫写import requestsfrom bs4 import BeautifulSoupimport reimport timeimport pandas as pdheaders = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'}def Translatorbyreptile():target = '睡觉时关,外面吵、有噪音时关,外面天气不好时关,出门离家时关,室外有雾霾时'url = 'https://translate.google.cn/#view=home&op=translate&sl=zh-CN&tl=en&text=' + targetresponse = requests.get(url=url, headers=headers)#print(response)html = response.textprint(html)soup = BeautifulSoup(html, 'html.parser') #Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据divs = soup.find_all(class_="tlid-translation translation")print(divs)# path = r'C:UsershaoDesktop批量翻译源文件东北住宅调研问卷.xlsx'# df = pd.read_excel(path, header=None)# #content_1, content_2, content_2, content_2, # for i in range(len(df[0])): #df[0]表示提取第一列# for j in range(len(df.iloc[0])): #df.iloc[0]表示提取第一行# #print(str(df.iloc[i,j]))# target = df.iloc[i,j]# Translatorbyreptile(target)# #df.iloc[i,j] = translation# #df.to_excel(r'C:UsershaoDesktop批量翻译结果EtoC.xlsx', index=False)Translatorbyreptile()'''最后发现谷歌翻译、百度翻译都应该是进行了反爬,得到的都是一大推乱码。。。。心累''' 第五天

最后发现谷歌翻译是可以支持直接翻译文件的,输入导出就可以了,so easy,只是得到的格式比较乱,只需要自己重新调整一下格式就好了

#利用谷歌翻译后的结果,进行格式的转换import pandas as pdpath = r'C:UsershaoDesktop批量翻译格式待调整两广入户调查问卷.xlsx'df = pd.read_excel(path, header=None)contents = []#content_1, content_2, content_2, content_2, for i in range(len(df[0])): #df[0]表示提取第一列for j in range(len(df.iloc[0])): #df.iloc[0]表示提取第一行#for j in range(81,85): #df.iloc[0]表示提取第一行print(str(df.iloc[i,j]))if str(df.iloc[i,j]) == 'nan':content = '{}'.format(df.iloc[i,j])print(content)contents.append(content)elif (str(type(df.iloc[i,j])) == "<class 'int'>") or (str(type(df.iloc[i,j])) == "<class 'float'>"):content = '{}'.format(df.iloc[i,j])print(content)contents.append(content)else:content = df.iloc[i,j]#print('第{}行第{}列元素:%s'.format(i, j)%content)contents.append(content)print('行和列的长度:%d,%d'%(len(df[0]), len(df.iloc[0])))print(contents)#df.to_excel(r'C:UsershaoDesktoptest_db3.xlsx', index=False)count_number = 0 for i in range(len(df[0])): #df[0]表示提取第一列for j in range(len(df.iloc[0])): #df.iloc[0]表示提取第一行#for j in range(81,85): #df.iloc[0]表示提取第一行# if j == 0:# df.iloc[i,j] = new_contents[]df.iloc[i,j] = contents[count_number]count_number += 1#print('第{}行第{}列元素:%s'.format(i, j)%content)print(df)df.to_excel(r'C:UsershaoDesktop批量翻译结果Guangdong-Guangdong-Home Survey.xlsx', index=False, header=0) 遇到的小问题

1.需要隐去表头索引,header=None 不然读取的时候会遇到问题

df = pd.read_excel(path, header=None)

存储的时候需要重新定义header,不然系统会自动加入数字的表头,另一个需要注意的是:要把索引给隐去, index=False

df.to_excel(r'C:UsershaoDesktoptest_db3.xlsx', index=False, header=0)

2.行和列弄混了,之前是这样的,如下

for i in range(len(df.iloc[0])): #df.iloc[0]表示读取第0行for j in range(len(df[0])): #df[0]读取第0列

实际上应该是读取的第一行当做列,读取的第一列当做行,/笑 正确代码如下

for i in range(len(df[0])):for j in range(len(df.iloc[0])):

3.为了检测行和列的运行值,进行了附带解释的打印,但之前没有同时打印过两个变量,出现了小错误,如下

print('行和列的长度:%d%d'%len(df[0])%len(df.iloc[0])) >>>TypeError: not enough arguments for format string for i in range(len(df[0])):for j in range(len(df.iloc[0])):快三大小单双买入法headers)#print(response)html = response.textprint(html)soup = BeautifulSoup(html, 'html.parser') #Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据divs = soup.find_all(class_="tlid-translation translation")print(divs)# path = r'C:UsershaoDesktop批量翻译源文件东北住宅调研问卷.xlsx'# df = pd.read_excel(path, header=None)# #content_1, content_2, content_2, content_2, # for i in range(len(df[0])): #df[0]表示提取第一列# for j in range(len(df.iloc[0])): #df.iloc[0]表示提取第一行# #print(str(df.iloc[i,j]))# target = df.iloc[i,j]# Translatorbyreptile(target)# #df.iloc[i,j] = translation# #df.to_excel(r'C:UsershaoDesktop批量翻译结果EtoC.xlsx', index=False)Translatorbyreptile()'''最后发现谷歌翻译、百度翻译都应该是进行了反爬,得到的都是一大推乱码。。。。心累''' 第五天

最后发现谷歌翻译是可以支持直接翻译文件的,输入导出就可以了,so easy,只是得到的格式比较乱,只需要自己重新调整一下格式就好了

#利用谷歌翻译后的结果,进行格式的转换import pandas as pdpath = r'C:UsershaoDesktop批量翻译格式待调整两广入户调查问卷.xlsx'df = pd.read_excel(path, header=None)contents = []#content_1, content_2, content_2, content_2, for i in range(len(df[0])): #df[0]表示提取第一列for j in range(len(df.iloc[0])): #df.iloc[0]表示提取第一行#for j in range(81,85): #df.iloc[0]表示提取第一行print(str(df.iloc[i,j]))if str(df.iloc[i,j]) == 'nan':content = '{}'.format(df.iloc[i,j])print(content)contents.append(content)elif (str(type(df.iloc[i,j])) == "<class 'int'>") or (str(type(df.iloc[i,j])) == "<class 'float'>"):content = '{}'.format(df.iloc[i,j])print(content)contents.append(content)else:content = df.iloc[i,j]#print('第{}行第{}列元素:%s'.format(i, j)%content)contents.append(content)print('行和列的长度:%d,%d'%(len(df[0]), len(df.iloc[0])))print(contents)#df.to_excel(r'C:UsershaoDesktoptest_db3.xlsx', index=False)count_number = 0 for i in range(len(df[0])): #df[0]表示提取第一列for j in range(len(df.iloc[0])): #df.iloc[0]表示提取第一行#for j in range(81,85): #df.iloc[0]表示提取第一行# if j == 0:# df.iloc[i,j] = new_contents[]df.iloc[i,j] = contents[count_number]count_number += 1#print('第{}行第{}列元素:%s'.format(i, j)%content)print(df)df.to_excel(r'C:UsershaoDesktop批量翻译结果Guangdong-Guangdong-Home Survey.xlsx', index=False, header=0) 遇到的小问题

1.需要隐去表头索引,header=None 不然读取的时候会遇到问题

df = pd.read_excel(path, header=None)

存储的时候需要重新定义header,不然系统会自动加入数字的表头,另一个需要注意的是:要把索引给隐去, index=False

df.to_excel(r'C:UsershaoDesktoptest_db3.xlsx', index=False, header=0)

2.行和列弄混了,之前是这样的,如下

for i in range(len(df.iloc[0])): #df.iloc[0]表示读取第0行for j in range(len(df[0])): #df[0]读取第0列

实际上应该是读取的第一行当做列,读取的第一列当做行,/笑 正确代码如下

for i in range(len(df[0])):for j in range(len(df.iloc[0])):

3.为了检测行和列的运行值,进行了附带解释的打印,但之前没有同时打印过两个变量,出现了小错误,如下

print('行和列的长度:%d%d'%len(df[0])%len(df.iloc[0])) >>>TypeError: not enough arguments for format string for i in range(len(df[0])):for j in range(len(df.iloc[0])):

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。