read_csv で UnicodeDecodeError が出る
pd.read_csv は UTF-8 を前提に読み込みます。Excel や業務システムが Shift_JIS で書き出した CSV を読むと、UnicodeDecodeError: 'utf-8' codec can't decode byte 0x82 in position 0: invalid start byte のようなエラーで止まります。0x82 は、Shift_JIS でひらがなや全角英数字の先頭に来るバイトです。
pd.read_csv('data.csv', encoding='cp932'):Windows や Excel で作られたファイルにはこれを使います。encoding='shift_jis'は、①、㈱、髙のような Windows 独自の文字があるとエラーになります。cp932を選ぶのが確実です。- 古い Unix 系のデータなら
encoding='euc_jp'です。 - 逆に UTF-8 のファイルを
cp932で読むと、'cp932' codec can't decodeのエラーか、縺薙sのような文字化けになります。 - 文字コードがわからなければ、ファイルを Mojibuster にドロップしてください。判別して UTF-8 で保存できます。
DataFrame に「縺」や「繧」が並ぶ
列名や値に 縺 や 繧 が並ぶなら、UTF-8 のデータが Shift_JIS として読まれています。読み込み方が原因なら encoding='utf-8' で読み直すだけです。データそのものが化けている場合、1 つの値なら value.encode('cp932').decode('utf-8') で戻ることもあります。ただし正しいセルが混ざっていたり、化けたときに欠けた文字があったりするとエラーになります。ファイルを Mojibuster で修正してから読み込むほうが確実です。
to_csv の CSV が Excel で文字化けする
df.to_csv('export.csv') は BOM なしの UTF-8 で書き出します。日本語版の Excel はこれを Shift_JIS として開くため、日本語が化けます。encoding='utf-8-sig' を指定すると BOM が付き、Excel も UTF-8 と認識します。詳しくは Excel の CSV 文字化け をご覧ください。
文字化け
鬘ァ螳「,菴乗園,萓。譬シ 螻ア逕ー,譚ア莠ャ,1250 驤エ譛ィ,遖丞イ。,980
修正後
顧客,住所,価格 山田,東京,1250 鈴木,福岡,980
取引先のシステムが Shift_JIS の CSV しか受け付けない場合は、encoding='cp932' で書き出します。CP932 にない絵文字などがあると UnicodeEncodeError になり、errors='replace' を付けるとその文字は ? に置き換わって失われます。
Windows の open() は cp932
open('file.txt') を encoding なしで呼ぶと、日本語版 Windows では cp932 で読み書きします。Mac や Linux で動いたスクリプトが、Windows では同じ UTF-8 ファイルで UnicodeDecodeError や文字化けを起こすのはこのためです。常に encoding='utf-8' を指定するか、環境変数 PYTHONUTF8=1 を設定してください。PEP 686 により、今後の Python では UTF-8 モードが標準になります。
requests で取得したデータ
requests は response.text の文字コードを Content-Type ヘッダーから決めます。テキストの応答で文字コードが示されていないと ISO-8859-1 とみなすため、UTF-8 の日本語は ã“ã‚“ã«ã¡ã¯ のように化けます。先に response.encoding = 'utf-8' を設定してください。Shift_JIS の古いサイトなら 'cp932' です。
Shift_JIS のファイルをまとめて UTF-8 にしたいときは、Shift_JIS を UTF-8 に変換 も参考にしてください。
よくある質問
Python のライブラリで直せませんか?
ftfy という文字化け修正ライブラリがありますが、主に é のようなヨーロッパ言語の文字化けが対象で、縺薙s のような Shift_JIS がらみの文字化けは対象外です。Mojibuster ならプログラムを書かずに修正でき、保存前にすべての変更箇所を確認できます。
よく使う encoding の値は?
utf-8、utf-8-sig(BOM 付き UTF-8)、cp932(Windows の Shift_JIS)、shift_jis、euc_jp、utf-16 です。大文字・小文字やハイフンの有無は区別されません。
区切り文字や数値はそのまま残りますか?
はい。Mojibuster が変えるのは化けた文字だけです。カンマ、引用符、改行はそのまま残ります。