Pandas: ファイルパスにアクセント付きのファイルを読み取るときのOSError

作成日 2017年01月09日  ·  27コメント  ·  ソース: pandas-dev/pandas

コードサンプル、可能であればコピーして貼り付けることができる例

test.txttest_é.txtは同じファイルですが、名前が変わるだけです。

pd.read_csv('test.txt')
Out[3]: 
   1 1 1
0  1 1 1
1  1 1 1

pd.read_csv('test_é.txt')
Traceback (most recent call last):

  File "<ipython-input-4-fd67679d1d17>", line 1, in <module>
    pd.read_csv('test_é.txt')

  File "d:\app\python36\lib\site-packages\pandas\io\parsers.py", line 646, in parser_f
    return _read(filepath_or_buffer, kwds)

  File "d:\app\python36\lib\site-packages\pandas\io\parsers.py", line 389, in _read
    parser = TextFileReader(filepath_or_buffer, **kwds)

  File "d:\app\python36\lib\site-packages\pandas\io\parsers.py", line 730, in __init__
    self._make_engine(self.engine)

  File "d:\app\python36\lib\site-packages\pandas\io\parsers.py", line 923, in _make_engine
    self._engine = CParserWrapper(self.f, **self.options)

  File "d:\app\python36\lib\site-packages\pandas\io\parsers.py", line 1390, in __init__
    self._reader = _parser.TextReader(src, **kwds)

  File "pandas\parser.pyx", line 373, in pandas.parser.TextReader.__cinit__ (pandas\parser.c:4184)

  File "pandas\parser.pyx", line 669, in pandas.parser.TextReader._setup_parser_source (pandas\parser.c:8471)

OSError: Initializing from file failed

問題の説明

パンダは、ファイルパスにアクセントが付いたファイルを読み取ろうとすると、OSErrorを返します。

問題は新しいです(Python3.6とPandas0.19.2にアップグレードしたので)

pd.show_versions()出力

インストールされたバージョン

コミット:なし
python:3.6.0.final.0
python-ビット:64
OS:Windows
OSリリース:7
マシン:AMD64
プロセッサー:Intel64ファミリー6モデル94ステッピング3、GenuineIntel
バイトオーダー:少し
LC_ALL:なし
言語:fr
ローカル:なし。なし

パンダ:0.19.2
鼻:なし
ピップ:9.0.1
setuptools:32.3.1
Cython:0.25.2
numpy:1.11.3
scipy:0.18.1
statsmodels:なし
xarray:なし
IPython:5.1.0
スフィンクス:1.5.1
patsy:なし
dateutil:2.6.0
pytz:2016.10
blosc:なし
ボトルネック:1.2.0
テーブル:なし
numexpr:2.6.1
matplotlib:1.5.3
openpyxl:なし
xlrd:なし
xlwt:なし
xlsxwriter:なし
lxml:なし
bs4:なし
html5lib:0.999999999
httplib2:なし
apiclient:なし
sqlalchemy:1.1.4
pymysql:なし
psycopg2:なし
jinja2:2.9.3
boto:なし
pandas_datareader:なし

Bug IO CSV Unicode Windows

最も参考になるコメント

同じ問題が発生したために誰かが私のようにここに来た場合、パンダがpep 529で動作するように修正されるまでの解決策があります(基本的に、非ASCII文字がパスに含まれるかファイル名がエラーになります):

コードの先頭に次の2行を挿入して、Windowsでパスを処理する古い方法に戻します。

import sys
sys._enablelegacywindowsfsencoding()

全てのコメント27件

ちょうど私のペニーの価値があります。 MacOSXとUbuntuですぐに試してみました
問題。 下記参照。

これは環境/プラットフォームの問題でしょうか? LOCALE
None.Noneます。 残念ながら、これを試すためのWindowsマシンがありません
の例。 確かに、これはあなたが後にこれを見た理由を説明しません
python3.6とpandas0.19.2にアップグレードします。

注:python3.6でvirtualenvをセットアップし、pipを使用してpandas0.19.2をインストールしました。

>>> import pandas as pd
>>> pd.read_csv('test_é.txt')
   a  b  c
0  1  2  3
1  4  5  6

pd.show_versions()の出力


インストールされたバージョン

コミット:なし
python:3.6.0.final.0
python-ビット:64
OS:Linux
OS-リリース:4.4.0-57-generic
マシン:x86_64
プロセッサー:x86_64
バイトオーダー:少し
LC_ALL:なし
言語:en_GB.UTF-8
ロケール:en_GB.UTF-8

パンダ:0.19.2
鼻:なし
ピップ:9.0.1
setuptools:32.3.1
Cython:なし
numpy:1.11.3
scipy:なし
statsmodels:なし
xarray:なし
IPython:なし
スフィンクス:なし
patsy:なし
dateutil:2.6.0
pytz:2016.10
blosc:なし
ボトルネック:なし
テーブル:なし
numexpr:なし
matplotlib:なし
openpyxl:なし
xlrd:なし
xlwt:なし
xlsxwriter:なし
lxml:なし
bs4:なし
html5lib:なし
httplib2:なし
apiclient:なし
sqlalchemy:なし
pymysql:なし
psycopg2:なし
jinja2:なし
boto:なし
pandas_datareader:なし

3.6は、Windowsのファイルシステムエンコーディングを(asciiから)utf8に切り替えると思います。 それを除けば、3.6のWindowsではまだテストを有効にしていません(必要なパッケージのいくつかがちょうど今利用可能になっているため)。

@JGoutin

だから私は3.6のappveyor(windows)にビルドサポートを追加したので、テストをプッシュしてそれが機能するかどうかを確認するのであれば、素晴らしいでしょう。

プログラムがpd.read_csv(file_path)で停止したときにも、同じ問題に直面しました。 Pythonを3.6にアップグレードした後の状況は私と似ています(最後にインストールしたPythonが正確にどのバージョンか、おそらく3.5 ......かどうかはわかりません)。

@jrebackここでの修正に向けた次のステップは何ですか?
あなたは「吹き飛ばされた」PRについて言及しました-それはどういう意味ですか?

私はWindowsを使用していませんが、手助けを試みることができます(Windowsでは明らかに機能しないコードの一部をデバッグするためのVMを入手しただけです)

ところで、回避策:名前の代わりにファイルハンドルを渡す
pd.read_csv(open('test_é.txt', 'r'))
(関連する問題にはいくつかの回避策がありますが、私はこれを見ていません)

@tpietruszka PRに関するコメントを参照してください//github.com/pandas-dev/pandas/pull/15092 (プライベートフォークから削除され、ほとんどそこにありました)。

基本的に、wnidowsのpy3.6(他のpythonと比較して)ではパスを異なる方法でエンコードする必要があります。 基本的に実装する必要があります: https ://docs.python.org/3/whatsnew/3.6.html#pep -529-change-windows-filesystem-encoding-to-utf-8

私の古いコード(実行できません):

import pandas as pd
import os
file_path='./dict/字典.csv'
df_name = pd.read_csv(file_path,sep=',' )

新しいコード(成功):

import pandas as pd
import os
file_path='./dict/dict.csv'
df_name = pd.read_csv(file_path,sep=',' )

このバグはファイル名の問題だと思います。
ファイル名を中国語から英語に変更しました。これで実行できます。

同じ問題が発生したために誰かが私のようにここに来た場合、パンダがpep 529で動作するように修正されるまでの解決策があります(基本的に、非ASCII文字がパスに含まれるかファイル名がエラーになります):

コードの先頭に次の2行を挿入して、Windowsでパスを処理する古い方法に戻します。

import sys
sys._enablelegacywindowsfsencoding()

上記のソリューションを使用すると、機能します。 どうもありがとう
ただし、DataFrame.to_csv()で同じ問題が発生しない理由についてはまだ混乱しています。 つまり、Unicodeファイルパスの場合、書き込みは問題ありませんが、読み取りは問題ありません。

path = os.path.join( 'E:\语料'、 'sina.csv')
pd.read_csv(open(path、 'r'、encoding = 'utf8'))

成功です。

影響を受けるシステムを持つ誰かがこの行を変更するかどうかを確認できますか

https://github.com/pandas-dev/pandas/blob/e8620abc12a4c468a75adb8607fd8e0eb1c472e7/pandas/io/common.py#L209

 return _expand_user(os.fsencode(filepath_or_buffer)), None, compression

それを修正しますか?

いいえ、違います。
結果:OSError:予期されたファイルパス名またはファイルのようなオブジェクト、取得タイプ
(Windows 10の場合)

    OSError                                   Traceback (most recent call last)
    <ipython-input-2-e8247998d6d4> in <module>()
      1 
----> 2 df = pd.read_csv(r'D:\mydata\Dropbox\uni\progrs\test öäau\n\teu.csv', sep='\t')

C:\conda\lib\site-packages\pandas\io\parsers.py in parser_f(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, squeeze, prefix, mangle_dupe_cols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, dayfirst, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, escapechar, comment, encoding, dialect, tupleize_cols, error_bad_lines, warn_bad_lines, skipfooter, skip_footer, doublequote, delim_whitespace, as_recarray, compact_ints, use_unsigned, low_memory, buffer_lines, memory_map, float_precision)
    707                     skip_blank_lines=skip_blank_lines)
    708 
--> 709         return _read(filepath_or_buffer, kwds)
    710 
    711     parser_f.__name__ = name

C:\conda\lib\site-packages\pandas\io\parsers.py in _read(filepath_or_buffer, kwds)
    447 
    448     # Create the parser.
--> 449     parser = TextFileReader(filepath_or_buffer, **kwds)
    450 
    451     if chunksize or iterator:

C:\conda\lib\site-packages\pandas\io\parsers.py in __init__(self, f, engine, **kwds)
    816             self.options['has_index_names'] = kwds['has_index_names']
    817 
--> 818         self._make_engine(self.engine)
    819 
    820     def close(self):

C:\conda\lib\site-packages\pandas\io\parsers.py in _make_engine(self, engine)
   1047     def _make_engine(self, engine='c'):
   1048         if engine == 'c':
-> 1049             self._engine = CParserWrapper(self.f, **self.options)
   1050         else:
   1051             if engine == 'python':

C:\conda\lib\site-packages\pandas\io\parsers.py in __init__(self, src, **kwds)
   1693         kwds['allow_leading_cols'] = self.index_col is not False
   1694 
-> 1695         self._reader = parsers.TextReader(src, **kwds)
   1696 
   1697         # XXX

pandas/_libs/parsers.pyx in pandas._libs.parsers.TextReader.__cinit__()

pandas/_libs/parsers.pyx in pandas._libs.parsers.TextReader._setup_parser_source()

OSError: Expected file path name or file-like object, got <class 'bytes'> type

あ、ごめんなさい。 fsdecodeはそこで機能しますか?


投稿者:Fotis Jannidis [email protected]
送信:2018年2月3日土曜日8:00:13 AM
宛先:pandas-dev / pandas
Cc:Tom Augspurger; コメント
件名:Re:[pandas-dev / pandas]ファイルパスにアクセント付きのファイルを読み取るときのOSError(#15086)

いいえ、違います。
結果:OSError:予期されたファイルパス名またはファイルのようなオブジェクト、取得タイプ


あなたがコメントしたのであなたはこれを受け取っています。
このメールに直接返信するか、GitHub https://github.com/pandas-dev/pandas/issues/15086#issuecomment-362809602で表示するか、スレッドhttps://github.com/notifications/unsubscribe-auth/をミュートします

いいえ。fsdecodeを使用すると、最初に発生したのと同じエラーが発生します( error_msg.txt

試していただきありがとうございます。


投稿者:Fotis Jannidis [email protected]
送信:2018年2月3日土曜日8:57:07 AM
宛先:pandas-dev / pandas
Cc:Tom Augspurger; コメント
件名:Re:[pandas-dev / pandas]ファイルパスにアクセント付きのファイルを読み取るときのOSError(#15086)

いいえ。fsdecodeを使用すると、最初に発生したのと同じエラーが発生します(error_msg.txt https://github.com/pandas-dev/pandas/files/1691837/error_msg.txt


あなたがコメントしたのであなたはこれを受け取っています。
このメールに直接返信するか、GitHub https://github.com/pandas-dev/pandas/issues/15086#issuecomment-362818153で表示するか、スレッドhttps://github.com/notifications/unsubscribe-auth/をミュートします

今日SteveDowerと話をしましたが、これが問題のある行である可能性があると彼は考えています//github.com/pandas-dev/pandas/blob/e8f206d8192b409bc39da1ba1b2c5bcd8b65cc9f/pandas/_libs/src/parser/io.c#L30

IIUC、WindowsファイルシステムAPIは、これらのバイトがMBCSにあることを想定していますが、utf-8を使用しています。

ユーザーレベルの回避策は、バイト文字列をpandasに渡す前に、ファイル名をmbcsとして明示的にエンコードすることです。 https://www.python.org/dev/peps/pep-0529/#explicitly -using-mbcs

pd.read_csv(filename.encode('mbcs'))

誰かがその回避策をテストすることができますか?

これを修正するには、パーサーコードを少し変更する必要があります(これを行うPRがありました)が、削除されました

動作しないstr bytes値ではなく、 strを想定しています。 それは失敗します

OSError: Expected file path name or file-like object, got <class 'bytes'> type

確認していただきありがとうございます。

15:43時金、2018年4月20日には、ジョアン・フェレイラD. [email protected]
書きました:

@TomAugspurgerhttps ://github.com/TomAugspurgerが機能しません。
read_csvは、バイト値ではなくstrを期待します。 それは失敗します

OSError:予期されたファイルパス名またはファイルのようなオブジェクト、取得タイプ


あなたが言及されたのであなたはこれを受け取っています。
このメールに直接返信し、GitHubで表示してください
https://github.com/pandas-dev/pandas/issues/15086#issuecomment-383217062
またはスレッドをミュートします
https://github.com/notifications/unsubscribe-auth/ABQHIiOHyt3sT7B0pHJuY5lB-cJtT5JHks5tqkiEgaJpZM4LeTSB

これにpingを送信するだけです-同じ問題があります。回避策を使用していますが、それが不要な場合はすばらしいでしょう。

これにはコミュニティパッチが必要です

この問題が発生しています。 patchcを試して貢献したいこれを修正し始める方法についてのポインタはありますか?

これを再現できるシステムにアクセスできるメンテナはいないと思います。

おそらく、この問題の他のいくつかは、解決策をまとめるのに役立つ可能性があります。

こんにちは、パンダ1.0.3この問題が発生し、 sys._enablelegacywindowsfsencoding()回避策が機能しなくなりました。 ファイルパスにąźがあります。
パンダ0.25.3でもこのエラーが発生しますが、回避策を使用すると0.23.4が正常に機能しているようです(他のバージョンは確認していません)。 追加情報を提供させていただきます。

ファイルがファイルと同じフォルダ名に保存されている場合は、のように同じフォルダ名からファイルを削除します。
そのフォルダからファイルを削除するだけです。
同じフォルダ名にファイルを保存しないでください。
その後、それは動作します

@pranjulknit理解

実際、jupyterノートブックからcsvファイルを読み取っているときにこの問題が発生します。

このページは役に立ちましたか?
0 / 5 - 0 評価