Python・pandas の文字化けを直す

pd.read_csv で UnicodeDecodeError が出る、to_csv で書き出した CSV が Excel で文字化けする――どちらも encoding の指定で解決します。日本語では、ファイルが Shift_JIS(CP932)と UTF-8 のどちらで保存されているかがポイントです。化けてしまったファイルは上の枠でそのまま修正できます。

テキストと次のファイルに対応:

  • CSV
  • TXT
  • JSON
  • XML
  • SRT
  • VTT
  • TSV
  • MD
  • HTML
  • SQL
  • LOG

Excel の CSV、データベースのダンプ、字幕、Web サイトのコードなど。

修正する

  1. ファイルをドロップ、またはテキストを貼り付け
  2. 自動で修正
  3. コピーまたはダウンロード
またはファイルをここにドラッグ
  • アップロードなし。 ファイルはブラウザー内で修正され、端末の外に出ることはありません。

  • EU 内のサーバー。 Mojibuster は フィンランド(EU)のサーバーで運用しており、EU 一般データ保護規則(GDPR)が適用されます。 GDPR の条文(EUR-Lex、英語)

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 文字化け をご覧ください。

pandas で書き出した CSV を Excel で開いた場合

文字化け

鬘ァ螳「,菴乗園,萓。譬シ
螻ア逕ー,譚ア莠ャ,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 が変えるのは化けた文字だけです。カンマ、引用符、改行はそのまま残ります。

関連ガイド