俺言語。

自分にしか理解できない言語で書かれた備忘録

【Python】文字列とバイト列と16進数文字列

テキストファイルの文字化けをバイナリ(バイト列)で置換する流れ

℃はutf-8で開くとUnicodeEncodeErrorが発生。
どうやらANSI文字らしい。

utf-8で無理やり扱うためにバイナリで開いて文字列を置換した時の覚え書き

バイナリでテキストをread

ファイルストリームをオープンする際のmode='b'で指定可能。

f = open(file, 'rb')
b = f.readline()  #℃

バイト列 -> 16進数文字列

byte列のメソッド、.hex()で16進数文字列に出力可能。
ここで気を付けるべきは文字列strだということ。

s_hex = b.hex() # => 'b043'

特定文字コードを置換

ここで特定文字コードを置換する。
大文字小文字は区別されるので注意。

s_hex_rep = s_hex.replace('b043', '818b43')

16進数文字列 -> バイト列 -> 文字列

この後コードで文字列を加工する必要があったためいったんutf-8でデコード。
その際はバイト列に戻してから文字列にデコード。
バイト列へはbinasciiモジュールで変換可能。

import binascii
s_rep = _binascii.unhexlify(s_hex_rep).decode('utf-8')

文字列 -> バイト列

ファイルをバイナリで書き込むためにバイト列へエンコード

b_rep = binascii.unhexlify(s_rep)

バイナリでファイル書き込み

w = open(new_file, 'wb')
w.write(b_rep)