備忘メモ。
mbox形式のファイルからメッセージを取り出して保存する際に利用した方法。
諸般の事情で、改行コードをLFからCRLFにする必要があった。
本来ならテキストベースで一行ずつ読み込んで保存する際に改行コードを付ければ良いが、メールデータだとメールヘッダやメッセージ本文のエンコードを都度確認しておかないとエンコードできない文字が出てくる場合がある。
変換できない文字を無視するという対応もあったが、できるだけ元に近い状態にしておきたかった。
そのため、バイナリでデータを読み込んで、バイナリデータ上で置換を行い、バイナリでファイルに書き込むようにした。
以下、改行「LF(¥n)」を「CRLF(¥r¥n)」に変換する場合の例。
- キーとメッセージ(バイナリデータ)を引数で渡す。
- メッセージのバイナリデータを、replaceで「b'¥n'」の箇所を「b'¥r¥n'」に変換する。
- キーの値からファイル名を作る。
- 作成したファイル名でバイナリモードでファイルを開き、バイナリデータを書き込む。
def write_contents(index, mail): mail = mail.replace(b'¥n', b'¥r¥n') filename = format(index, '04d') + '.eml' file = open(filename, mode='wb') file.write(mail) file.close()
なお、「LF」と「CRLF」が混在していた場合は、このやり方だと「CRCRLF」となる。
そのため、一旦はCRLFをLFに変換した後で、もう一度LFをCRLFに変換するなどの工夫をしておく方が良いのかもしれない。