这次接到一个需求,需要把postgresql数据库中批量的地名进行翻译,大约200多个,自己翻译也非常的慢。于是想到用百度翻译的API对数据库的数据逐条进行翻译。正好也在学习Python语言,正好可以用Python对数据库的内容进行朱行翻译。数据如下所示:
百度API
标准版:提供基础文本翻译服务,QPS(每秒并发请求量)=1,个人或企业用户均可申请使用
高级版:提供基础文本翻译服务,同时可申请自定义词表功能(敬请期待),QPS=10,供个人认证用户申请使用
尊享版:提供基础文本翻译服务,同时可申请词典、语音合成、自定义词表功能,QPS=100,供企业认证用户申请使用
标准版:免费使用,不限使用字符量
高级版、尊享版:每月翻译字符数低于200万,享免费服务;超过200万字符,按照49元/百万字符支付当月超出部分字符量费用
为了速度快一点,我这里选择的是高级版,毕竟数据不是非常多。
python代码
import psycopg2
import hashlib
import psycopg2.extras
import random
import json
import requests
import time
conn = psycopg2.connect(database="bike", user="postgres", password="postgres", host="localhost", port="5432")
cursor = conn.cursor()
print("Opened database successfully")
def translate(cn):
url = "http://api.fanyi.baidu.com/api/trans/vip/translate?from=zh&to=en&appid=20190816000327052&q=" + cn
appid = "自己的百度翻译appid"
secret = "自己的百度翻译secret"
# 随机数
salt = str(random.randint(5000, 10000))
data = appid + cn + salt + secret
mm = hashlib.md5(data.encode(encoding='UTF-8')).hexdigest()
# md5加密
url = url + "&salt=" + salt + "&sign=" + mm
response = requests.get(url)
print(response.text)
data = json.loads(response.text)
return data["trans_result"][0]["dst"]
save_data = []
sql_select = "select gid,street from shanghai1"
cursor.execute(sql_select)
rows = cursor.fetchall()
for row in rows:
result =translate(row[1]).replace("'","")
save_data.append({"gid": str(row[0]), "name": result})
time.sleep(0.2) # 避免频繁调用百度翻译失败,账号有迸发限制
conn.commit()
cursor.close()
conn.close()
conn = psycopg2.connect(database="bike", user="postgres", password="postgres", host="localhost", port="5432")
cursor = conn.cursor()
for item in save_data:
sql_update = "update shanghai1 set name = '"+item["name"]+"' where gid ="+item["gid"]+";"
print(sql_update)
cursor.execute(sql_update)
print(cursor.rowcount)
conn.commit()
print(cursor.rowcount)
cursor.close()
conn.close()
翻译结果
运行前面的python代码,最终的翻译结果如下图所示
感觉这个小功能还是非常有用的,和大家分享一下