transk’s 翻訳ブログ

翻訳がらみの情報など

win32com で Outlook の受信トレイのメールを読み込む(Python)

Python でメールを操作する練習をしようと思って

ちょっと調べたら

メールサーバーに直接アクセスする方法もあるが

win32com で Outlook を操作できるようなので

とりあえずそれでいじってみた。

メールの送信は誰かが書いたコードをコピペするだけでできたが

メールの受信は

outlook = win32com.client.Dispatch('outlook.application')
mapi = outlook.GetNamespace("MAPI")
inbox = mapi.GetDefaultFolder(6)

 

のようなコードが使われているが

わたしの環境では読み取れない。

folders = inbox.Folders
for folder in folders:
    print('Name: ' + folder.name)

 

というコードを付加してフォルダーを表示してみると

Name: 連絡先候補
Name: スレッド アクション設定
Name: クイック操作設定

と表示される。

読み取りたいフォルダー番号はおそらく 5 なんだけど

フォルダー名を指定してもうまく読み取れない。

なので、ネットで調べたら

英語のページに

別の方法があったので

それでコーディングしてみた。

import win32com.client

# APPの初期化
outlook = win32com.client.Dispatch('outlook.application')
mapi = outlook.GetNamespace("MAPI")

inbox_mails = mapi.Folders['xxx@hotmail.com'].Folders['受信トレイ']

for mail in inbox_mails.Items:
    print('SenderEmailAddress: ', mail.SenderEmailAddress)
    print('SenderName: ', mail.Sender)
    print('Subject: ', mail.subject)
    print('To: ', mail.To)
    print('Cc: ', mail.Cc)
#    print('Bcc: ', mail.Bcc)
    print('ReceivedTime: ', str(mail.receivedtime))
    print('Body: ', mail.body)
    print('Attachments: ', mail.Attachments)
 

 

このコードで読み取ることができた。

わたしは Outlook

プロバイダーのメール、Hotmail、Yahoo メールなどを複数登録してあるので

メールアドレスが最初のフォルダー名となっているようだ。

 

とりあえず、Outlook のメールを受信できるようになったが

やりたいのは受信したメールに返信することで

受信内容を編集すればできないことはないが

何か簡単な方法はないかなといま思案している。

Python で win32com を使って Excel の重複行を削除する

前に作った .mxliff ファイルを Excel ファイルに出力するプログラムで

transk.hatenablog.com

同じ内容のセグメントが複数出力されていたので

何度も同じ文を見直さなくてはいけなくて

これは重複する行を削除しないと

効率が悪いなと思って

プログラムに機能追加することにした。

 

Excel で .xlsx ファイルを開くと

[データ] > [重複の削除] というメニューがあって

そこで重複行を削除できるようだ。

f:id:transk:20211205185419j:plain

Excel 自体にその機能があるんだから

win32com でもあるんじゃないかなと思って

とりあえず、Excel でその操作をマクロに記録してみた。

ActiveSheet.Range("$A$1:$F$1000").RemoveDuplicates Columns:=Array(1, 2), _
Header:=xlNo

 

RemoveDuplicates というのが win32com にあれば

それを使うことができるが

ネットで検索してもあまりヒットしない。

PythonExcel の重複行を削除する」と検索すると

Excel ファイルを pandas で読み込んで

drop_duplicates で削除して

Excel ファイルに書き戻すという記事があって

それだと確実にできそうだが

pandas に全部読み込んで Excel ファイルに書き戻すというのが

ちょっと無駄な感じがしたので

win32com のほうをコーディングしてみた。

ws.Range("A:F").RemoveDuplicates Columns:=Array(1, 2), Header:=xlNo

 

実行すると Columns でエラーになる。

この書き方は Python じゃないな。

かっこで囲んでみた。

ws.Range("A:F").RemoveDuplicates(Columns:=Array(1, 2), Header:=xlNo)

 

Columns は通ったが

今度は Array でエラーになる。

単純に取ってしまえばいいかなと思って

ws.Range("A:F").RemoveDuplicates(Columns:=(1, 2), Header:=xlNo)

 

としたら正常に実行されてしまった。

xlno はすでに定義してあった(値は 2 で、範囲全体を対象とする)。

わりとあっさりできてしまった。

 

これで重複した行を何度もチェックする必要がなくなった。

ソースとターゲットの両方で重複を確認しているので

同じ文を違う訳し方にしているところは維持される。

Python で .mxliff ファイルを Excel ファイルに出力するプログラムを作った

翻訳ツールで作業していて

一通り翻訳した後に見直すとき

テキストファイルや Excel ファイルに出力して

それでチェックしている。

Memsource で作業しているときは

ローカルに  .mxliff ファイルが作成される。

.mxliff ファイルは

Memsource XML Localization Interchange File Format の略で

XML または XLIFF の一種だ。

テキストエディターで開いたり

プログラムで編集することができる。

Xbench 3.0(有料版)だと .mxliff ファイルを読み込むことができるんだけど

Xbench 2.9(無料版)だと読み込むことができない。

それについては調べて

.mxliff ファイル内のすべての <target> タグに

state='translated' を追加して

<target state='translated'> のようにすれば

読み込まれることはわかったんだけど

line = line.replace("<target>","<target state='translated'>")

 

Xbench 2.9 だとテキストファイルに出力したときに

マッチ率が出力されない(Xbench 3.0 は出力されたと思う)。

それだと作業しづらいので

Python で .mxliff ファイルの内容を

Excel ファイルに出力するプログラムを作成することにした。

 

入力が .mxliff ファイルで出力が Excel ファイル

使用するライブラリは openpyxl、win32com、BeautifulSoup など。

from bs4 import BeautifulSoup
import openpyxl
import win32com.client

 

最初に 2 つのファイルをオープンして

BeautifulSoup で

各セグメントの内容がある <group> タグを検索してループし

<source> と <target>、<context fuzzyMatch>(マッチ率)を

Excel ファイルに出力する。

<trans-unit m:locked> が True のセグメントは

翻訳対象外のセグメントなのでスキップする。

これで .mxliff ファイルの内容が Excel ファイルに出力される。

 

これで翻訳作業に使うことができるんだけど

せっかくここまでプログラムを作ったので

普段 Excel で見直し用にデータを編集していた作業を

プログラムでやってしまうことにした。

まず、新規の翻訳とファジーマッチを別々のシートに分ける。

要注意として翻訳中にマーキングしておいたセグメントを

ソートしてシートの一番上に持ってくる。

各行の幅の調整やセルの上揃え、セルの折り返し、ソート、シートの倍率などを設定する。

xlTop         = -4160
ws.Range("A:G").VerticalAlignment = xlTop

 

いつも Excel では自分で定義した Office 2003 の配色を使っているんだけど

([ページ レイアウト] > [配色] > [ユーザー定義])

それだけは Python で設定する方法がわからなかった。

 

これをしばらく使ってみて

レアケースのバグが何回かでたが

問題なく使用できている。

openpyxl と win32com を前半と後半でそれぞれ使っているからか

Excel ファイルを受け渡すときに File not found のエラーがでるときがある。

それは Windows でサインインしなおすと解消される。

(開いている Excel を全部閉じるとエラーは起こらないようだ)

必要に迫られて Python のプログラムを作ったんだけど

逆に作業を効率化できた。

 

<target> タグを <target state='translated'></target> に

変更するだけのプログラムも作ったので

Xbench でチェックすることもできる。

英辞郎第七版を PDIC 形式から EPWING 形式に変換してみた

先週、ブックオフに行ったら

英辞郎第七版が 200 円で売っていたので

EPWING 辞書として使えるかなと思って買ってみた。

f:id:transk:20210912144808j:plain

うちに帰ってきてから調べたら

英辞郎の最新版は英辞郎第十一版のようだ。

217 万項目収録で 3080 円。

英辞郎第七版は 190 万項目収録で 200 円だったので

十分使用価値があってお得だと思う。

 

英辞郎PDIC という形式らしいので

EPWING のツールではそのまま使用できないそうだ。

でも、EBStudio というツールを使うと

PDIC 形式を EPWING 形式に変換できるようだ。

 

とりあえず、英辞郎を普通にインストールしてみようと思って

インストーラーを起動した([管理者として実行] から実行)。

f:id:transk:20210912144607j:plain

[INSTALL] を選択するとインストールが始まる。

f:id:transk:20210912145217j:plain

以前のバージョンがある場合の注意の画面がでて

[次へ] をクリックしたら

f:id:transk:20210912144641j:plain

エラーで止まってしまった。

アルクのホームページなどを調べて

いろいろ試したが解決しない。

200 円が無駄になったかと思ったが

専用ツールのインストールはあきらめて

インストール CD に辞書データのテキストファイルがあったはずなので

CD を見てみたら

Eijiro7T というフォルダーに TXT.zip というファイルがあった。

開いてみると

f:id:transk:20210912144637j:plain

Eiji-136.txt など 4 ファイルが入っていた。

英和辞書だけ欲しいので

Eiji-136.txt を解凍した。

 

さて、このファイルを変換しないといけないので

EBStudio をダウンロードしてインストールした。

現在のバージョンは EBStudio2 だ。

起動すると

次のような画面が表示される。

f:id:transk:20210912144626j:plain

マニュアルを読んだが

操作方法がよくわからないので

とりあえず、英辞郎のテキストファイルを

ドラッグアンドドロップしてみた。

f:id:transk:20210912150900j:plain

いくつか設定画面がでて

適当に進めたら

ファイルが登録された。

あとは変換の設定を指定する必要がある。

マニュアルによると

英辞郎用の設定ファイルがあるそうなので

EBStudio2 を起動し直して

EBStudio2 の zip ファイルを解凍したフォルダーの

support\jiro-eijieo.ebx を EBStudio2 に

ドラッグアンドドロップしたら

f:id:transk:20210912144630j:plain

英辞郎用に設定されたようだ。

次に、英辞郎のテキストファイルをドラッグアンドドロップしたら

f:id:transk:20210912144632j:plain

この設定画面(2/2)が表示されたので

[辞郎形式] を選択して [OK] を押した。

(最初は [PDICテキスト形式] や [Plain Text] を選択してしまって

辞書ファイルは作成されて DDwin で認識されたが

単語が表示されなくて途方に暮れたが)

これで設定が完了したようなので

[EPWING] > [変換] を選択して変換を実行した。

f:id:transk:20210912144628j:plain

10 秒ほどで完了した(マシンは Core i3)。

[出力パス] に指定したフォルダーに

辞書ファイルが作成されていた。

これをほかの辞書ファイルを格納しているフォルダーにコピーして

DDwin で辞書検索したら

英辞郎の辞書が検出されてグループに登録できた。

(辞書の登録時は [管理者として実行] から起動する必要があるようだ)

f:id:transk:20210912144634j:plain

無事に DDwin で英辞郎の単語が検索されるようになった。

項目数が多すぎるので

ちょっと邪魔なくらいだ。

一番下に表示されるようにした。

いままでは

手持ちの辞書でいい訳語が見つからないときだけ

ネットの英辞郎で検索していたが

これからは DDwin で一緒に検索されるようになったので

便利になった。

 

その後、このブログを書くために

もう一度、英辞郎インストーラーを起動して

試しに進めてみたら

なぜかエラーがでずに進めることができた。

なぜ動作が変わったのかわからない。

f:id:transk:20210912144639j:plain

まあでも専用ツールも使用できるようになった。

たぶん、DDwin しか使わないと思うが。

 

たまたまブックオフで見つけた英辞郎

辞書を増やすことができて

お買い得だった。