Python实现批量翻译的示例代码
作者:极客柒 发布时间:2023-02-27 04:24:12
标签:Python,批量,翻译
截图
源码
Translator.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-
from copy import deepcopy
from distutils.log import Log
from email import utils
import json
import http.client #修改引用的模块
import hashlib
from msilib import Table
from multiprocessing.dummy import Array
from operator import index, truediv
from tokenize import group
from turtle import st #修改引用的模块
from urllib import parse
import random
from Log import Debug
# 百度注册开发者 并创建通用翻译 使用高级翻译app应用接口 获取 appid和secretKey
# 百度开发使用的api接口 翻译的句子会比 游客身份翻译的结果 更准确
appid = '20220829001324165' #你的appid 这里可以先用我的试用一下
secretKey = 'owSrQDeWHGPvI0U1BUm8' #你的密钥
singleTranslteMaxCount = 3 #单个单词翻译失败次数的上限
class WordInformation:
_reqCount = None
_from = None
_to = None
_text = None
_translateText = None
_nextWorld = None
def __init__(self, text:str,fromLanguage:str,toLanguage:str,nextWorld) -> None:
self._reqCount = 0
self._text = text
self._from = fromLanguage
self._to = toLanguage
self._nextWorld = nextWorld
def CanReq(self):
if self._reqCount > singleTranslteMaxCount:
return False
self._reqCount += 1
return True
def GetText(self):
return self._text
def GetTranslateText(self):
if None != self._translateText:
return self._translateText
return self._text
def GetNext(self):
return self._nextWorld
def Translater( worldInfo:WordInformation):
if worldInfo == None:
return
Debug.Log(f"{worldInfo.GetText()} 正在翻译...")
myurl = '/api/trans/vip/translate'
q = worldInfo.GetText()
fromLang = worldInfo._from
toLang = worldInfo._to
salt = random.randint(32768, 65536)
sign = appid+q+str(salt)+secretKey
m1 = hashlib.md5()
m1.update(sign.encode("utf-8"))
sign = m1.hexdigest()
myurl = myurl+'?appid='+appid+'&q='+parse.quote(q)+'&from='+fromLang+'&to='+toLang+'&salt='+str(salt)+'&sign='+sign
httpClient = http.client.HTTPConnection('api.fanyi.baidu.com')
httpClient.request('GET', myurl)
response = httpClient.getresponse()
#转码
html = response.read().decode('utf-8')
html = json.loads(html)
if httpClient:
httpClient.close()
if "trans_result" in html:
dst = html["trans_result"][0]["dst"]
worldInfo._translateText = dst
# Translater(worldInfo.GetNext())
# else:
# if worldInfo.CanReq():
# Translater(worldInfo)
# else:
# Translater(worldInfo.GetNext())
def GetWorldInfoArrByTextArr( texts:Array,fromLanguage:str,toLanguage:str ):
num = len(texts)
worlds = []
for i in range(num-1,0,-1):
if i == num - 1:
world = WordInformation(texts[i],fromLanguage,toLanguage,None)
worlds.append(world)
else:
world = WordInformation(texts[i],fromLanguage,toLanguage,worlds[len(worlds)-1])
worlds.append(world)
return worlds
def Translation( needTranslateTexts:Array,fromLanguage:str,toLanguage:str ):
worlds = GetWorldInfoArrByTextArr(needTranslateTexts,fromLanguage,toLanguage)
Debug.Runtime("翻译用时: ")
# 递推方式 next指针不为none 递归执行next
# Translater(worlds[len(worlds)-1])
# 迭代方式
for i in range(0,len(worlds)):
Translater(worlds[i])
if worlds[i].GetTranslateText() == None and worlds[i].CanReq():
i -= 1
Debug.Runtime("翻译用时: ")
worlds.reverse()
translateTexts = [ ]
for world in worlds:
translateTexts.append(world.GetTranslateText())
return translateTexts,worlds
Log.py
import sys
import time
import traceback
import Utils
DEBUG = True #if sys.gettrace() else False
class Debug:
__log = ''
__time = dict()
@staticmethod
def Log(textContent:str):
'''
输出日志 DEBUG模式下 同时输出编辑器显示
'''
times = time.time()
local_time = time.localtime(times)
tstr = time.strftime("%Y-%m-%d %H:%M:%S",local_time)
str1 = f"{tstr}\t{textContent}\n"
if DEBUG:
print(str1)
Debug.__log += str1
@staticmethod
def LogExcept():
'''
输出堆栈信息 一般用于捕获异常报错后调用
'''
Debug.Log(traceback.format_exc())
@staticmethod
def Runtime(str1):
'''
输出两次打印间程序的运行时间
成双成对的方式出现
第一次调用并不会打印任何信息
仅在第二次调用后 返回与第一调用间的间隔
'''
if(str1 in Debug.__time.keys()):
runtime = time.time() - Debug.__time[str1]
del Debug.__time[str1]
Debug.Log("%s%f秒"%(str1,runtime))
else:
Debug.__time[str1] = time.time()
@staticmethod
def Output():
Utils.writeInFile('./log.txt', Debug.__log)
Utils.py
'''
工具类
'''
import base64
import json # json相关
import os # 文件流相关
import zipfile # zip亚索文件
import shutil # 删除整个文件夹
def fromFile(url):
try:
with open(url, 'r', encoding='utf-8') as fp:
return fp.read()
finally:
fp.close()
def fromFile2Base64(url):
try:
with open(url, 'rb') as f1:
return str(base64.b64encode(f1.read()), encoding='utf-8')
finally:
f1.close()
def writeInFile(toFile, content):
try:
with open(toFile, 'w', encoding='utf-8') as fp:
fp.write(content)
finally:
fp.close()
def fromJsonAsDict(url):
return json.loads((fromFile(url)))
def writeDictInFile(url, dict1):
writeInFile(url, json.dumps(dict1, ensure_ascii=False, indent=2))
def revealInFileExplorer(targetDir):
try:
os.startfile(targetDir)
except:
os.system("explorer.exe %s" % targetDir)
def zipFile(src, dest):
'''
src: 目标文件位置 D:/123.txt
dest: 压缩后输出的zip路径 D:/123.zip
'''
with zipfile.ZipFile(dest, 'w',zipfile.ZIP_DEFLATED) as p:
p.write(src,os.path.split(src)[1])
p.close()
def zipFiles(src,dest):
'''
src: 目标文件夹位置 D:/hellowd
dest: 压缩后输出的zip路径 D:/hellowd.zip
'''
with zipfile.ZipFile(dest, 'w',zipfile.ZIP_DEFLATED) as pZip:
for folder, _, files in os.walk(src):
relative_url = folder.replace(src, '')
for file in files:
pZip.write(os.path.join(folder,file),os.path.join(relative_url,file))
pZip.close()
def removeFile(url):
if os.path.isdir(url):
shutil.rmtree(url)
else:
os.remove(url)
简单的使用案例
# 导入Translation
from Translator import Translation
zhTexts = ["为了解决商家的让利活动我压力很大。","为了解决商家的让利活动我压力很大。","消耗{0}体力","获取{0}钞票" ]
enTexts,enWorlds = Translation(zhTexts,'zh','en')
print(enTexts)
Python版本
python 3.99
可兼容版本 3.x
来源:https://blog.csdn.net/qq_39162566/article/details/126634776


猜你喜欢
- 目录爬取目标站点分析编码时间爬取结果展示爬取目标站点分析本次采集的目标站点为:https://www.zaih.com/falcon/men
- 前言这篇文章主要是就在公司实习的时候,对SQL优化工作作出的一些整理。在公司实习的时候,导师分配了SQL慢查询优化的任务,任务是这样的:每周
- 一、概念我们可以将工作池理解为线程池。线程池的创建和销毁非常消耗资源,所以专门写一个pool,每次用过的线程池再放回pool中而不是销毁。不
- 函数参数的使用又有俩个方面值得注意:1.函数参数是如何定义的 2.在调用函数的过程中参数是如何被解析先看第一个问题,在python中函数参数
- 1. 数据库的概念1.1 数据库(Database)是统一管理的相关数据的集合。长期存储在计算机内,有结构的、集成的、可共享的、统一管理的数
- 家里没网络,实在无聊,玩游戏都没味道,只好玩CSS。这个东西实在没什么技术含量在里面,纯属打发时间。简单说明:一张图片放在底层,
- 一.问题描述python 中使用open打开某个文件写入时,往往会发现需要写入的文件不在同级目录下。这样就需要根据文件的路径来找到并打开。但
- 本文实例讲述了MySQL中ROUND函数进行四舍五入操作陷阱。分享给大家供大家参考,具体如下:在MySQL中, ROUND 函数用于对查询结
- 前言在做数据恢复时,偶尔会碰到需要对数据文件位置调整的案例,在这种情况下,可以在RMAN中使用SET NEWNAME命令。在Oracle 1
- 安装 JSX 插件在 Vue2 中要想使用 jsx 开发,需要安装 @vue/babel-preset-jsx 等插件,之后在 babel
- 下面介绍两种查看django 执行的sql语句的方法。方法一:queryset = Apple.objects.all()print que
- 模块的作用是:允许从任何文件里得到任何一行或几行,并且使用缓存进行优化。有几个API接口linecache.getlines(filenam
- 今天看YUI的视频教程,YUI的工程师介绍的一款在线的图片压缩工具,也许你用过,也许没有,不过我这里强烈推荐大家用一下,我用smush.it
- 想要查看每次训练模型后的 loss 值变化需要如下操作loss_value= [ ]self.history = model.fit(sta
- Hello大家好,今天说一下python的socket编程,基于python的socket通信的文本框网络聊天首先,实验环境:一个云服务器(
- 定义一个什么都不做的函数>>> def a():... pass...>>> def printHell
- 如何在页面中实现对电子信箱的访问?emaile.htm<HTML><HEAD><META NAME=
- 废话不多说 上语句:查询锁表语句:select object_name,machine,s.sid,s.serial#from v$lock
- 一、MySQL数据库的实例管理器概述:1、MySQL数据库的实例管理器(IM)是通过TCP/IP端口运行的后台程序,用来监视和管理MySQL
- Harris 角点检测算法1. 角点角点是水平方向、垂直方向变化都很大的像素。角点检测算法的基本思想: