Python 实现word文档题目英译汉翻译功能

640 阅读3分钟

这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战

背景

学习前端三个月了,准备刷刷面试题,总结总结,一天几道面试题,向大厂进军。

某一天,突然有个朋友说,你这搞程序的,能帮我把word英文翻译成中文吗?我着急用,

我:wps不是有自带的整夜翻译功能吗?

朋友:收费啊,老贵了,得好几十块钱。

我:....

那你把word文档发过来吧

开搞

我们先来看一看哥们给发的word格式:

image.png

看上去还挺有规律的,我们就一句一个给翻译呗,反正不是我们的api

思路:

  1. 选取编程语言
  2. 首先去找英译汉的免费api
  3. 读取word内容
  4. 一段一段去翻译
  5. 翻译完以后,重新建立一个word文档保存题目和翻译结果。

由于自己已经学了几天Python了,也想用python实验一下,主要是python开发代码少,方便。

免费翻译api

找度娘,拿来吧你,各平台免费翻译API

image.png

实验了一下可以调用。

Python 怎样操作word呢?

经过查找资料查到 python-docx

API也特别简单: 主要用到了Document(文档操作),Paragraph(段落操作)。

  1. const document=Document(path) //读取word 文档
  2. document.paragraphs 获取所有的段落
  3. paragraph.text 获取段落文本
  4. 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)

最终效果:

image.png

生成的word文档:

image.png

结语

一步一步慢慢来,踏踏实实把活干!