1. ホーム
  2. Python

TypeError: write() の引数はバイトではなく str でなければならない Python3 でバイナリファイルを書き込む方法とエラーの原因

2022-02-18 05:18:48

Python2はバイナリファイルにランダムに書き込む。

with open('/python2/random.bin','w') as f:
    f.write(os.urandom(10))

しかし、Python3を使用するとエラーが報告されます。

TypeError:must be str, not bytes

その理由は、Python 3ではopen関数にencodingという新しいパラメータが追加され、そのデフォルトが「utf-8」になっているからです。そのため、ファイルハンドルで読み書きする場合、システムは開発者に、バイナリデータを含むbyteではなく、ユニコード文字を含むインスタンスを渡すように要求します。

回避策

操作対象のファイルを開く際に、本来の文字書き込みモード('w')ではなく、バイナリ書き込みモード('wb')を使用します。

Python3、Python2ともに以下のように適応させる。

with open('python3/rndom.bin','wb') as f:
    f.write(os.urandom(10))

ファイルからデータを読み込む場合にも、同様の問題があります。この問題の解決方法も同様で、「r」モードを使うのではなく、「rb」モード(バイナリモード)でファイルを開くことです。