Apache Beam の ReadFromText において任意の文字コードを指定する方法(Python3.7)

ストレージなどに置かれたテキストファイルを読み込む際によく使用されるReadFromTextモジュールですが、defaultの文字コードはutf-8となっており調べてみてもbyte型やint型に対応するものはあれど、他の文字コードに対応するモジュールは用意されていないようでした。そこで今回はドキュメントを参考に他の文字コードを指定するクラスを作成します。

# default
| "ReadFromText" >> beam.io.ReadFromText([INPUT])

デフォルトで設定されているモジュールです。

class StrUtf8Coder(Coder):
    """A coder used for reading and writing strings as UTF-8."""
    def encode(self, value):
        return value.encode('utf-8')

    def decode(self, value):
        return value.decode('utf-8')

    def is_deterministic(self):
        return True

上記のencode, decodeの引数を任意の文字コードに変更します。
クラス名も別途付けてあげて下さい。

class StrCp932Coder(Coder):
    """A coder used for reading and writing strings as UTF-8."""
    def encode(self, value):
        return value.encode('cp932')

    def decode(self, value):
        return value.decode('cp932')

    def is_deterministic(self):
        return True

今回は例としてcp932で作成しました。
最後にReadFromTextモジュールに渡すと設定されます。

| "ReadFromText" >> beam.io.ReadFromText(options.input, coder=StrCp932Coder())

手順は至ってシンプルです。
`UnicodeDecodeError: 'XX-XX' codec can't decode` エラーが出た際は是非試してみて下さい。バイバイ

この記事が気に入ったらサポートをしてみませんか?