- 環境
- 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")