LoginSignup
50
28

More than 3 years have passed since last update.

UnicodeDecodeError: 'shift_jis' codec can't decode byteとなった時の対応方法

Posted at
  • 環境
    • Windows10 Pro バージョン1909
    • Python 3.8.5
    • Pandas 1.0.5

事象 : CSVファイルをPandasで読み込んだら怒られた

Traceback (most recent call last):
  File "C:/path/to/my_code.py", line 258, in <module>
    csv = read_files(target_dir)
  File "C:/path/to/my_code.py", line 74, in read_files
    data = pd.read_csv(file, encoding="shift_jis")
  File "C:\path\to\venv\lib\site-packages\pandas\io\parsers.py", line 676, in parser_f
    return _read(filepath_or_buffer, kwds)
  File "C:\path\to\venv\lib\site-packages\pandas\io\parsers.py", line 448, in _read
    parser = TextFileReader(fp_or_buf, **kwds)
  File "C:\path\to\venv\lib\site-packages\pandas\io\parsers.py", line 880, in __init__
    self._make_engine(self.engine)
  File "C:\path\to\venv\lib\site-packages\pandas\io\parsers.py", line 1114, in _make_engine
    self._engine = CParserWrapper(self.f, **self.options)
  File "C:\path\to\venv\lib\site-packages\pandas\io\parsers.py", line 1891, in __init__
    self._reader = parsers.TextReader(src, **kwds)
  File "pandas\_libs\parsers.pyx", line 529, in pandas._libs.parsers.TextReader.__cinit__
  File "pandas\_libs\parsers.pyx", line 720, in pandas._libs.parsers.TextReader._get_header
  File "pandas\_libs\parsers.pyx", line 916, in pandas._libs.parsers.TextReader._tokenize_rows
  File "pandas\_libs\parsers.pyx", line 2063, in pandas._libs.parsers.raise_parser_error
UnicodeDecodeError: 'shift_jis' codec can't decode byte 0xee in position 4225: illegal multibyte sequence
my_code.py
data = pd.read_csv(file, encoding="shift_jis")

原因 : ファイルにSJISにはなくてCP932にはある拡張文字があるから。

これは、test2.csvに、
・ハシゴダカ "髙"
・タチサキ "崎"
等の、windows拡張文字列が混ざっている事に起因します。
pandasにexcel出力のcsvを読ませる時に注意する点 - Qiita

頭悪いので組み合わせを試してみた。
※. 拡張文字には「髙﨑」をつかってみた。

read_csvの
文字コード
ファイルの
文字コード
ファイルの
拡張文字あり
ファイルの
拡張文字なし
shift_jis shift_jis エラー OK
shift_jis cp392 エラー OK
cp932 shift_jis エラー
エディタ(Sublime Text)で
拡張文字を入れて保存すると
保存はできるけど警告が出る。
からおかしいと気が付くはず・・・
OK
cp932 cp932 OK OK
cp932でshift_jisで拡張文字ありのファイルを読み込んだ時のエラー
# ...省略...
UnicodeDecodeError: 'cp932' codec can't decode byte 0x86 in position 5: illegal multibyte sequence

Windowsで日本語のあるファイルを使うならcp932にしておくのがよさげだ。
CP932とSJISについても勉強してみた。

対応 : CP932でファイルを読み込む

my_code.py
data = pd.read_csv(file, encoding="cp932")
50
28
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
50
28