目录
- 操作过程中不断遇到新的问题,思路的转换过程
- 背景
-
- 第一天 操作过程
- 第二天
-
- 正则表达式是个好东西
- 第三天
- 第四天
- 第五天
- 遇到的小问题
操作过程中不断遇到新的问题,思路的转换过程
背景
今天接到一个任务,需要将EXCEL文件中的中文翻译成英文,由于表格内容非常大,我想着 这要是手动翻译,三天啥都不用干了,就翻译这个吧
于是有了用python批量翻译的想法
目前的思路是,将excel中每个单元的内容拿出来,放在一个列表中,然后用翻译软件翻译再批量存入新的表格(应该可以用API接口,将所有单元内容依次拿出、翻译、存入,这个还没学会。。。)
参考文章:pandas操作
第一天 操作过程
1.发现一个问题,google翻译有字数上限。。。一次最多5000字符

于是想到分几步粘贴,需要翻译的表格差不多两万多。自己多动几次手就好了。
好,终于翻译完了,开始运行
新问题来了,谷歌在翻译的大段字符的时候,把有的引号 ‘’ 给吞了,这就造成了列表中间的元素发生了紊乱,这个就比较麻烦了,刚开始尝试手动修改,把吞掉的引号给他补上,手动操作5分钟之后,我放弃了,这尼玛也太坑了。就在我准备砸电脑放弃的时候,突然灵光一闪,想到可以用正则表达式批量计算啊,简直不要太机智
import pandas as pd
path = r'C:\Users\hao\Desktop\批量翻译\源文件\两广-住宅调研问卷.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 pd
from translate import Translator
path = r'C:\Users\hao\Desktop\批量翻译\源文件\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] = translation
df.to_excel(r'C:\Users\hao\Desktop\批量翻译\结果\EtoC.xlsx', index=False)
第四天
既然谷歌提供的API只让翻译1000个词,我就在翻译界面看了一下页面源码
发现,源码上有直接的翻译结果的,那我干脆自己直接用爬虫抓取得了,还要他的API干嘛,talk is cheap,show me the code
#自己利用爬虫写
import requests
from bs4 import BeautifulSoup
import re
import time
import pandas as pd
headers = {'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=' + target
response = requests.get(url=url, headers=headers)
#print(response)
html = response.text
print(html)
soup = BeautifulSoup(html, 'html.parser') #Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据
divs = soup.find_all(class_="tlid-translation translation")
print(divs)
# path = r'C:\Users\hao\Desktop\批量翻译\源文件\东北住宅调研问卷.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:\Users\hao\Desktop\批量翻译\结果\EtoC.xlsx', index=False)
Translatorbyreptile()
'''
最后发现谷歌翻译、百度翻译都应该是进行了反爬,得到的都是一大推乱码。。。。心累
'''
第五天
最后发现谷歌翻译是可以支持直接翻译文件的,输入导出就可以了,so easy,只是得到的格式比较乱,只需要自己重新调整一下格式就好了
#利用谷歌翻译后的结果,进行格式的转换
import pandas as pd
path = r'C:\Users\hao\Desktop\批量翻译\格式待调整\两广入户调查问卷.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:\Users\hao\Desktop\test_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:\Users\hao\Desktop\批量翻译\结果\Guangdong-Guangdong-Home Survey.xlsx', index=False, header=0)
遇到的小问题
1.需要隐去表头索引,header=None 不然读取的时候会遇到问题
存储的时候需要重新定义header,不然系统会自动加入数字的表头,另一个需要注意的是:要把索引给隐去, index=False
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])):