这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战
背景
学习前端三个月了,准备刷刷面试题,总结总结,一天几道面试题,向大厂进军。
某一天,突然有个朋友说,你这搞程序的,能帮我把word英文翻译成中文吗?我着急用,
我:wps不是有自带的整夜翻译功能吗?
朋友:收费啊,老贵了,得好几十块钱。
我:....
那你把word文档发过来吧
开搞
我们先来看一看哥们给发的word格式:
看上去还挺有规律的,我们就一句一个给翻译呗,反正不是我们的api
思路:
- 选取编程语言
- 首先去找英译汉的免费api
- 读取word内容
- 一段一段去翻译
- 翻译完以后,重新建立一个word文档保存题目和翻译结果。
由于自己已经学了几天Python了,也想用python实验一下,主要是python开发代码少,方便。
免费翻译api
找度娘,拿来吧你,各平台免费翻译API
实验了一下可以调用。
Python 怎样操作word呢?
经过查找资料查到 python-docx
API也特别简单: 主要用到了Document(文档操作),Paragraph(段落操作)。
- const document=Document(path) //读取word 文档
- document.paragraphs 获取所有的段落
- paragraph.text 获取段落文本
- document.add_paragraph 添加段落
调用网络请求
- urllib2/urllib (python自带库)
- httplib/urllib (python自带库)
- Requests (第三方库)
由于上两种都是python自带的,支持的比较底层,需要编解码等等,对新手不友好,果断选择第三种:requests
考虑怎样去把请求结果写入word
由于网络请求是异步的,我们此时需要考虑写一个递归来实现异步循环调用。直接使用for循环,或者while肯定是不行的。
代码演示:
# coding=utf-8
import requests
import json
import time
import random
from docx import Document
path = r"D:\英语共享文件\testa.docx"
# 读取文档
document = Document(path)
# 需要翻译的每个段落文本
L = []
titleFlag = ["题目:", "A. ", "B. ", "C. ", "D. "]
# 获取段落文本,存放到L中
def loopDocument():
for paragraph in document.paragraphs:
# 去除段落左右两边空格
str = paragraph.text.strip()
if len(str) != 0:
L.append(str)
# 添加翻译结果到新的word中
def appendDocument(allR):
title = 0
curNum = 0
# 创建新的word文档
newDocument = Document()
allLen = len(allR)
while curNum < allLen:
# 由于题目是有标题和ABCD四个选项组成,所以这里给题目增加序号
if title > 4:
title = 0
curInfo = allR[curNum]
# 添加原英文
newDocument.add_paragraph(titleFlag[title]+curInfo["src"])
# 添加英文->中文结果
newDocument.add_paragraph(curInfo["tgt"])
curNum = curNum+1
title = title+1
# 保存文档
newDocument.save("D:\英语共享文件\testa1.docx")
# 执行获取所有的段落文本
loopDocument()
# 请求头,模拟浏览器
header = {
'content-type': "application/json",
'Accept-Encoding': 'gzip, deflate, compress',
'Accept-Language': 'en-us;q=0.5,en;q=0.3',
'Cache-Control': 'max-age=0',
'Connection': 'keep-alive',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
}
# 访问有道云翻译接口
url = "http://fanyi.youdao.com/translate"
# 存储所有的翻译结果
allResult = []
# 记录当前翻译开始索引,递归迭代。
startIndex = 0
# 网络请求
def reqNet(p, index, next):
# url需要的参数
data = {"doctype": "json", "type": "AUTO",
"i": p}
req = requests.get(url, headers=header, params=data)
appendResult = {"src": p, "tgt": "没有查出结果"}
try:
result = req.json()
except Exception as e:
print(e)
else:
# 解析json数据
if result['errorCode'] == 0:
print(result)
transResult = result['translateResult']
if transResult:
if transResult[0]:
info = transResult[0][0]
appendResult = info
else:
print("填写失败")
print(appendResult)
allResult.append(appendResult)
# 接口延迟1-3秒再请求,防止请求过密
time.sleep(random.randint(1, 3))
# 指针继续下一个
next(index+1)
totalLen = len(L)
# 开始循环
def start(curIndex):
if curIndex >= totalLen:
appendDocument(allResult)
print("结束")
return
par = L[curIndex]
if par:
print("执行下一个: %s" % par)
reqNet(par, curIndex, start)
else:
appendDocument(allResult)
print("循环结束")
try:
start(0)
except Exception as msg:
# 处理异常,发生异常,先保存当前翻译的结果
print("异常:%s" % msg)
appendDocument(allResult)
最终效果:
生成的word文档:
结语
一步一步慢慢来,踏踏实实把活干!