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

标签:Python,批量,翻译
0
投稿

猜你喜欢

  • Ubuntu自启动Mysql的三种方式

    2024-01-15 22:51:41
  • Python使用自带的ConfigParser模块读写ini配置文件

    2022-04-01 00:07:01
  • 使用python将图片按标签分入不同文件夹的方法

    2021-04-14 05:34:54
  • python爬虫爬取幽默笑话网站

    2021-05-31 18:32:58
  • 详解Python的三种可变参数

    2022-06-18 03:09:27
  • python操作xml文件示例

    2022-06-17 22:38:28
  • sqlserver 存储过程动态参数调用实现代码

    2024-01-25 05:11:07
  • SQL Server技巧之快速得到表的记录总数

    2011-01-04 14:36:00
  • JS动态添加与删除select中的Option对象(示例代码)

    2023-09-17 02:15:31
  • mysql socket文件作用详解

    2024-01-24 02:18:53
  • Javascript 虚拟 DOM详解

    2024-04-18 10:31:30
  • Golang中channel的原理解读(推荐)

    2024-02-08 15:41:38
  • 详解Python中@staticmethod和@classmethod区别及使用示例代码

    2023-06-03 12:17:20
  • pandas DataFrame 警告(SettingWithCopyWarning)的解决

    2023-08-20 07:45:31
  • python制作小说爬虫实录

    2023-09-30 17:39:25
  • python给视频添加背景音乐并改变音量的具体方法

    2021-01-26 20:18:47
  • python正则过滤字母、中文、数字及特殊字符方法详解

    2022-02-20 10:14:47
  • 如何让利用Python+AI使静态图片动起来

    2022-06-06 08:15:31
  • Flask框架实现的前端RSA加密与后端Python解密功能详解

    2021-07-26 16:28:13
  • Python如何使用ConfigParser读取配置文件

    2023-11-03 03:05:30
  • asp之家 网络编程 m.aspxhome.com