みずりゅの自由帳

主に参加したイベントやソフトウェア技術/開発について記録しています

Python3でMBOXからバイナリで読み込んだメッセージデータの改行コードを変更する

備忘メモ。

mbox形式のファイルからメッセージを取り出して保存する際に利用した方法。
諸般の事情で、改行コードをLFからCRLFにする必要があった。

本来ならテキストベースで一行ずつ読み込んで保存する際に改行コードを付ければ良いが、メールデータだとメールヘッダやメッセージ本文のエンコードを都度確認しておかないとエンコードできない文字が出てくる場合がある。
変換できない文字を無視するという対応もあったが、できるだけ元に近い状態にしておきたかった。

そのため、バイナリでデータを読み込んで、バイナリデータ上で置換を行い、バイナリでファイルに書き込むようにした。

以下、改行「LF(¥n)」を「CRLF(¥r¥n)」に変換する場合の例。

  1. キーとメッセージ(バイナリデータ)を引数で渡す。
  2. メッセージのバイナリデータを、replaceで「b'¥n'」の箇所を「b'¥r¥n'」に変換する。
  3. キーの値からファイル名を作る。
  4. 作成したファイル名でバイナリモードでファイルを開き、バイナリデータを書き込む。
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に変換するなどの工夫をしておく方が良いのかもしれない。