Python 实现大文件全文翻译

周末在看一本英文书籍,发现还是有不少专业词汇读起来不顺,再要连成文章感觉太累。
想到百度和谷歌翻译,把不懂的词汇或者语句拷贝过去,确实轻松不少,想想是不是可以整篇文章一次翻译出来?
没想到发现不少问题,一是每次拷贝限制字数只有5000,二是如果传文档上去,无论是百度还是谷歌,甚至把网易有道、搜狐、微软等等找了一圈,都没有好的办法,除非给银子。
一次只有5000字,一篇文章好歹几十万的字数,拷贝粘贴岂不是几个月都无法解决?
人生苦短,怎么能把时间花在拷贝粘贴之上?用python吧。

长话短说,开始动手了。先是百度一下,发现前人有不少工作,似乎很简单的一件事。但动手后,发现这件事情还是很多弯弯道道,把过程写了下来,让大家参考吧。

一、谷歌翻译
从《Python3调用Google翻译》(附录1)写了一段谷歌的翻译,但很快发现几个问题:(1)谷歌的翻译结果一般般,没有网页上准确,仔细看了,发现是谷歌给了几种翻译,但用python调用谷歌翻译,结果是另外一条。(这种情况网易有道也类似)(2)谷歌翻译限制连接数,翻译了一段后,后面的就不给用了。

注:这篇文章写得很简洁易懂,但对结果处理不好,只能取到部分翻译结果,而且如果文章有换行等就容易出错了。
在这里插入图片描述
二、Python自带翻译
放弃了谷歌,便想到Python自己能不能做?还真找到了,见附件2,好简单。但用后更加失望,虽然这个Translate介绍是用了微软的接口,单句的实现效果不错,但很快就发现:(1)一次限制500字符数,长一点段落就出错了;(2)接口调用也被限制了次数。

后来发现附录3《Python实现文档自动翻译》写得比较全面,但实现大文件文全翻译还是有很多不足,其中介绍的方法没有一种可以拿来就用。

三、大文件全文翻译实现
仔细比较后,发现还是老老实实用百度的翻译API模式最好,便以此来实现大文件翻译,结果还算可以。

假设源文件为 temp.txt , 翻译的结果存在 result.txt
由于文件较大,采用逐行读取逐行翻译的方式
百度API使用百度提供的示例,改写为函数,改进2点:(1)翻译后的结果通过json解释,返回字符串而不是json;(2)由于注册用了标准版,限制每秒不能超过一次,否则出错。所以强制加了延时1秒。牺牲了速度,可以申请高级版开发权限,每月有200万字的免费试用。

注:源文件中可以有换行,但尽量把空行,如只有空格的行格式化。

代码如下:

# 有些库用于测试,就没清理了
import urllib.request  
import urllib.parse  
import json 
import requests
import http.client
import hashlib
import urllib
import random
import time


# 写TXT文档
def write_txt(path,content):
    '''实现TXT文档的写方法'''
    with open(path,'a+') as f:
        f.write(content)

# 百度翻译API方法
def baidu_translate(content):
    '''实现百度翻译'''
    appid = '*******'  # 填写你的appid
    secretKey = '********'  # 填写你的密钥

    httpClient = None
    myurl = '/api/trans/vip/translate'

    fromLang = 'auto'   #原文语种
    toLang = 'zh'   #译文语种
    salt = random.randint(32768, 65536)
    q= content
    sign = appid + q + str(salt) + secretKey
    sign = hashlib.md5(sign.encode()).hexdigest()
    myurl = myurl + '?appid=' + appid + '&q=' + urllib.parse.quote(q) + '&from=' + fromLang + '&to=' + toLang + '&salt=' + str(
    salt) + '&sign=' + sign

    time.sleep(1)

    try:
        httpClient = http.client.HTTPConnection('api.fanyi.baidu.com')
        httpClient.request('GET', myurl)

        # response是HTTPResponse对象
        response = httpClient.getresponse()
        result_all = response.read().decode("utf-8")
        result = json.loads(result_all)

        print (result)
        print (len(result))

        trans = result['trans_result']
        ret = ''
        for i in range(len(trans)):
            ret += trans[i]['dst'] 
        # print(ret)

    except Exception as e:
        ret = ""
        print (e)
    finally:
        if httpClient:
            httpClient.close()

    return ret

def main():
    srcFile = "e:\\test\\temp.txt"
    destFile = "e:\\test\\result.txt"
    bWr = True

    for line in open(srcFile,'r'):
        line =  line.strip('\n')
        if(len(line)<1):  # 该行仅仅是换行
            bWr = False
        else:
            bWr = True

        if(bWr):
            # write_txt(destFile,translate(line)+"\n") # python translate 库
            # write_txt(destFile,google_translate(line)+"\n")  #google get 方法
            write_txt(destFile,baidu_translate(line)+"\n")  #百度API 方法
            # write_txt(destFile,youdao_translate(line)+"\n")  # 有道方法

if __name__ == '__main__':
  main()

参考文章:

  1. Python3调用Google翻译 https://www.jianshu.com/p/e42609d9a9e8
  2. Python3中使用translate实现翻译 https://blog.csdn.net/qq_16668303/article/details/89677696
  3. Python实现文档自动翻译 https://www.jianshu.com/p/2d51a87e2926
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二粒米

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值