pythonのバージョンを3.6にし、pandasで日本語ファイル名が読み込めなくなった場合の対処法

python3.5でpandasのread_csvを使ってファイル名が日本語のデータを読み込んでもエラーが起きなかったのに、3.6にアップグレードして実行したらエラーが起きるようになりました。備忘録として解決策を残しておきます。

実行環境はwin10です。

エラーの内容

エラーが起きたpythonのバージョンは以下の通りです。
Python 3.6.2 :: Anaconda 4.4.0 (64-bit)


read_csvで読み込むファイルを"てすと.csv"とします。
中身は以下のものが入ってます。

1,2
3,4
5,6
7,8

このファイルを以下のコードで読み込み、中身をprintします。

import pandas as pd

df = pd.read_csv("てすと.csv")
print(df)

すると以下のようなエラーが出力されます。
OSError: Initializing from file failed

ちなみにファイル名が英語の場合はこのエラーは起きず、きちんと中身をprint出来ました。

python3.5で同じコードを実行してみる

python3.5の仮想環境を構築する

次に同じコードをpythonのバージョンを3.5に変更して実行してみます。

最初に「Anacondaのcondaコマンドによる仮想環境の使い方のまとめ」を参考に、
condaのcreateコマンドを使用してpython3.5の仮想環境を構築しました。

やり方はanaconda promptを開いて以下のように打ち込みます。
conda create -n test python=3.5 anaconda

上記のように打ち込むことで、testという名前ですべてのパッケージがインストールされたpython3.5の仮想環境が構築することできます。

今回は何も考えずにすべてのパッケージをインストールしましたが、個別にインストールすることもできます。

仮想環境を構築したら
activate test

で環境を切り替えます。(Windows以外の人は source active test と打ち込んでください)

バージョンを確認すると


> python --version
Python 3.5.5 :: Anaconda, Inc.

となっているので、これでpython3.5でコードを実行できるようになりました。

同じコードの実行結果

この状態で先ほどと同じコードを実行するとエラーが起きず、csvファイルの中身が出力されました。
このことからpythonのバージョンを3.5から3.6にしたことが原因だと分かります。

原因と対策

原因

原因について調べていたら同様の症状が発生している人がいました。
Python3.6のpandasで「Initializing from file failed」が起きた場合の対策

こちらの記事によると
ソースコードを追いかけていくと、pandas.ioの中のparser.pyにおいて、CParserWrapper起動時に呼び出されるファイル「parser.cp36-win_amd64.pyd」がファイル読み込みに対応していて、この中に何かしらの不具合があるだろうということが分かりました。ただし、pydファイル(コンパイル済み)となっているため、このファイル自体の修正はバージョンアップを待つほかなさそうです。
 と原因を推定しておりました。

対策

先ほど紹介した記事では対策として
  1. 読み込みエンジンにc(デフォルト)ではなく’python’を指定する。
  2. ファイル名をマルチバイトを含まない表記にリネームする
の2つを上げています。
1については


df = pd.read_csv("てすと.csv")


df = pd.read_csv("てすと.csv", engine = "python")

と変更します。
デフォルトでは読み込みエンジンとしてCを使っているのですが、pythonを指定することでエラーを回避できるみたいです。
2については、先ほど紹介した記事ではマルチバイトを取り除くスクリプトを作成しておりそちらを実行するのでもいいし、読み込むファイル名を英語にするでもいいかと思います。

あとは今回紹介したように古いバージョンのpythonの仮想環境を構築してもエラーを回避できるのかな?と思います。
ただ、仮想環境を構築する方法はanacondaが入っている必要があるので、汎用性を考えるのなら1番の解決策がいいのかなと思います。注意点として、1番の方法はファイル読み込みが若干遅くなるそうです。

0 件のコメント :

コメントを投稿