接続先のデータベースはOracle Database。
py-translatorとcx_Oracleを使ってやってみた。
準備
py-translatorのインストール
cx_Oracleのインストール
https://oracle.github.io/python-cx_Oracle より引用
About cx_Oracle
cx_Oracle is a Python extension module that enables access to Oracle Database. It conforms to the Python database API 2.0 specification with a considerable number of additions and a couple of exclusions.
Installationに掲載されている手順を実行。(以下を実施した)
cx_Oracleインストール
$ pip install cx_Oracle
Oracle Instant Clientのインストール
別途ダウンロードしたInstantClient(公式手順にリンク有)を/opt/oracleに配置しunzip
$ mkdir -p /opt/oracle
$ cd /opt/oracle
$ unzip instantclient-basic-linux.x64-18.3.0.0.0dbru.zip
libaioのインストール
$ sudo yum install libaio
環境変数に追加
export LD_LIBRARY_PATH=/opt/oracle/instantclient_18_3:$LD_LIBRARY_PATH
確認
$ python
Python 3.6.7 (default, Nov 15 2018, 16:29:08)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cx_Oracle
>>> cx_Oracle.clientversion()
(18, 3, 0, 0, 0)
>>>
インストールしたInstant Clientのバージョン(18.3)を返している。
実行
表の特定列のデータ(英語)を翻訳して結果をファイルに出力する
大福帳形式でデータを持っていたので、集計してから翻訳
※count(1)はそれぞれの件数を知りたかったので一緒に出力
select 英語の列, count(1) from 表 group by 英語の列 order by count(1) desc
このSQLの結果セットのカーソル内でpy_translatorを使って翻訳。
以下、★のところ(2か所)を環境に合わせて編集して実行。この例ではlargetable表のprofession列を翻訳。
※sleepを入れたのは、短時間にtranslateしすぎるとエラー(ブロックされるっぽい?)になったので。
import cx_Oracle
import os
import csv
from time import sleep
from py_translator import Translator
translator = Translator()
# ★翻訳したい列名と、そのテーブル名を指定
col = 'profession'
tab= 'largetable'
# 出力ファイル名
filename= 'translate_' + col + '.csv'
f = open(filename, 'w')
writer = csv.writer(f, lineterminator='\n')
os.environ["NLS_LANG"] = "JAPANESE_JAPAN.AL32UTF8"
## ★接続先のOracle Databaseに合わせて編集
conn=cx_Oracle.connect(user='username', password='passwd', dsn='192.0.2.2/PDB1servicename.xxxx')
sql='select ' + col + ', count(*) from ' + tab + ' group by ' + col + ' order by count(*) desc '
print (sql)
csvlist = ['ID','ORIGINAL','TRANSLATED','NUM_COUNT']
writer.writerow(csvlist)
print('Now Processing...')
cur = conn.cursor()
seq = 1
for row in cur.execute(sql):
sleep(5)
# ↑↑↑重要
csvlist = []
csvlist.append(seq)
csvlist.append(row[0])
csvlist.append(translator.translate(text=row[0], dest='ja').text)
csvlist.append(row[1])
# ファイルに出力
writer.writerow(csvlist)
seq += 1
print('.', end="", flush=True)
f.close()
print('¥nTranslation Completed')
print('Output File Name:', filename)
結果
出力ファイルから、今回試した profession列(職業を示す)の、ORIGINAL(元の値), TRANSLATED(日本語訳)がわかる。
$ python t.py
$ cat translate_profession.csv
ID,ORIGINAL,TRANSLATED,NUM_COUNT
1,Programmer/Developer,プログラマ/開発者,137
2,IT Staff,ITスタッフ,89
3,Nurse,ナース,54
... (略)...