Pandas: OSError saat membaca file dengan aksen di jalur file

Dibuat pada 9 Jan 2017  ·  27Komentar  ·  Sumber: pandas-dev/pandas

Contoh Kode, contoh copy-paste jika memungkinkan

test.txt dan test_é.txt adalah file yang sama, hanya perubahan namanya:

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

Deskripsi masalah

Pandas mengembalikan OSError saat mencoba membaca file dengan aksen di jalur file.

Masalahnya baru (Sejak saya meningkatkan ke Python 3.6 dan Pandas 0.19.2)

Keluaran pd.show_versions()

VERSI TERPASANG

commit: Tidak ada
python: 3.6.0.final.0
python-bits: 64
OS: Windows
Rilis OS: 7
mesin: AMD64
prosesor: Intel64 Family 6 Model 94 Stepping 3, GenuineIntel
byteorder: sedikit
LC_ALL: Tidak ada
LANG: fr
LOCALE: Tidak ada. Tidak ada

panda: 0.19.2
hidung: Tidak ada
pip: 9.0.1
setuptools: 32.3.1
Cython: 0.25.2
numpy: 1.11.3
scipy: 0.18.1
statsmodels: Tidak ada
xarray: Tidak ada
IPython: 5.1.0
sphinx: 1.5.1
patsy: Tidak ada
dateutil: 2.6.0.0
pytz: 2016.10
blosc: Tidak ada
kemacetan: 1.2.0
tabel: Tidak ada
numexpr: 2.6.1
matplotlib: 1.5.3
openpyxl: Tidak ada
xlrd: Tidak ada
xlwt: Tidak ada
xlsxwriter: Tidak ada
lxml: Tidak ada
bs4: Tidak ada
html5lib: 0,999999999
httplib2: Tidak ada
apiclient: Tidak ada
sqlalchemy: 1.1.4
pymysql: Tidak ada
psycopg2: Tidak ada
jinja2: 2.9.3
boto: Tidak ada
pandas_datareader: Tidak ada

Bug IO CSV Unicode Windows

Komentar yang paling membantu

Jika ada yang datang ke sini seperti saya karena dia mengalami masalah yang sama, berikut adalah solusi sampai panda diperbaiki untuk bekerja dengan pep 529 (pada dasarnya semua karakter non ascii akan berada di jalur atau nama file Anda akan menghasilkan kesalahan):

Masukkan dua baris berikut di awal kode Anda untuk kembali ke cara lama menangani jalur di windows:

import sys
sys._enablelegacywindowsfsencoding()

Semua 27 komentar

Hanya uang saya yang berharga. Cepat mencobanya di Mac OSX dan Ubuntu tanpa
masalah. Lihat di bawah.

Mungkinkah ini masalah lingkungan / platform? Saya perhatikan bahwa LOCALE adalah
setel ke None.None . Sayangnya saya tidak memiliki mesin windows untuk mencoba ini
contoh di. Memang ini tidak akan menjelaskan mengapa Anda melihat ini setelah
tingkatkan ke python3.6 dan pandas 0.19.2.

Catatan: Saya baru saja menyiapkan virtualenv dengan python3.6 dan menginstal pandas 0.19.2 menggunakan pip.

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

Output dari pd.show_versions ()


VERSI TERPASANG

commit: Tidak ada
python: 3.6.0.final.0
python-bits: 64
OS: Linux
Rilis OS: 4.4.0-57-generik
mesin: x86_64
prosesor: x86_64
byteorder: sedikit
LC_ALL: Tidak ada
LANG: en_GB.UTF-8
LOCALE: en_GB.UTF-8

panda: 0.19.2
hidung: Tidak ada
pip: 9.0.1
setuptools: 32.3.1
Cython: Tidak ada
numpy: 1.11.3
scipy: Tidak ada
statsmodels: Tidak ada
xarray: Tidak ada
IPython: Tidak ada
sphinx: Tidak ada
patsy: Tidak ada
dateutil: 2.6.0.0
pytz: 2016.10
blosc: Tidak ada
kemacetan: Tidak ada
tabel: Tidak ada
numexpr: Tidak ada
matplotlib: Tidak ada
openpyxl: Tidak ada
xlrd: Tidak ada
xlwt: Tidak ada
xlsxwriter: Tidak ada
lxml: Tidak ada
bs4: Tidak ada
html5lib: Tidak ada
httplib2: Tidak ada
apiclient: Tidak ada
sqlalchemy: Tidak ada
pymysql: Tidak ada
psycopg2: Tidak ada
jinja2: Tidak ada
boto: Tidak ada
pandas_datareader: Tidak ada

Saya percaya 3.6 mengalihkan pengkodean sistem file pada windows ke utf8 (dari ascii). Selain itu, kami belum mengaktifkan pengujian di windows untuk 3.6 (karena beberapa paket yang diperlukan baru saja tersedia).

@Bayu_joo

jadi saya baru saja menambahkan dukungan build pada appveyor (windows) untuk 3.6, jadi jika Anda akan meningkatkan pengujian Anda untuk melihat apakah berhasil, akan sangat bagus.

Saya juga menghadapi masalah yang sama ketika program berhenti di pd.read_csv (file_path). Situasinya mirip dengan saya setelah saya mengupgrade python saya ke 3.6 (saya tidak yakin kapan terakhir kali python yang saya instal persis versi apa, mungkin 3.5 ......).

@jreback apa langkah selanjutnya menuju perbaikan di sini?
Anda telah menyebutkan PR yang 'meledak' - apa artinya?

Meskipun saya tidak menggunakan Windows, saya dapat mencoba membantu (baru saja mendapat VM untuk men-debug sebagian kode saya yang tampaknya tidak berfungsi di windows)

BTW, solusinya: berikan pegangan file, bukan nama
pd.read_csv(open('test_é.txt', 'r'))
(ada beberapa solusi dalam masalah terkait, tetapi saya belum melihat yang ini)

@tpietruszka lihat komentar di PR: https://github.com/pandas-dev/pandas/pull/15092 (itu dihapus dari garpu pribadi, cukup banyak di sana).

Anda pada dasarnya perlu menyandikan jalur secara berbeda di py3.6 (vs ular piton lain) di wnidows. pada dasarnya perlu mengimplementasikan: https://docs.python.org/3/whatsnew/3.6.html#pep -529-change-windows-filesystem-encoding-to-utf-8

kode lama saya (tidak dapat dijalankan):

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

kode baru (berhasil):

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

Saya pikir bug ini adalah masalah nama file.
Saya mengubah nama file dari Cina ke Inggris, itu bisa berjalan sekarang.

Jika ada yang datang ke sini seperti saya karena dia mengalami masalah yang sama, berikut adalah solusi sampai panda diperbaiki untuk bekerja dengan pep 529 (pada dasarnya semua karakter non ascii akan berada di jalur atau nama file Anda akan menghasilkan kesalahan):

Masukkan dua baris berikut di awal kode Anda untuk kembali ke cara lama menangani jalur di windows:

import sys
sys._enablelegacywindowsfsencoding()

Saya menggunakan solusi di atas dan berhasil. Terima kasih banyak @fotisj !
Namun saya masih bingung mengapa DataFrame.to_csv () tidak terjadi masalah yang sama. Dengan kata lain, untuk jalur file unicode, tulis tidak apa-apa, sedangkan baca tidak.

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

Itu berhasil.

Dapatkah seseorang dengan sistem yang terpengaruh memeriksa apakah mengubah baris ini

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

untuk

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

memperbaikinya?

Tidak.
Hasil dalam: OSError: Nama jalur file yang diharapkan atau objek seperti file, didapatTipe
(di 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

Oh maaf. Apakah fsdecode berfungsi di sana?


Dari: Fotis Jannidis [email protected]
Dikirim: Sabtu, 3 Februari 2018 08.00:13
Kepada: pandas-dev / pandas
Cc: Tom Augspurger; Komentar
Subject: Re: [pandas-dev / pandas] OSError saat membaca file dengan aksen di jalur file (# 15086)

Tidak.
Hasil dalam: OSError: Nama jalur file yang diharapkan atau objek seperti file, didapatTipe

-
Anda menerima ini karena Anda berkomentar.
Balas email ini secara langsung, lihat di GitHub https://github.com/pandas-dev/pandas/issues/15086#issuecomment-362809602 , atau nonaktifkan utas https://github.com/notifications/unsubscribe-auth/ ABQHIplv8thHxpjsP3knUCpET0Fjy0kLks5tRGZsgaJpZM4LeTSB .

Tidak. Menggunakan fsdecode menghasilkan kesalahan yang sama dengan yang kami alami ( error_msg.txt )

Ok terima kasih sudah mencoba.


Dari: Fotis Jannidis [email protected]
Dikirim: Sabtu, 3 Februari 2018 08.57.07
Kepada: pandas-dev / pandas
Cc: Tom Augspurger; Komentar
Subject: Re: [pandas-dev / pandas] OSError saat membaca file dengan aksen di jalur file (# 15086)

Tidak. Menggunakan fsdecode menghasilkan kesalahan yang sama dengan yang kami alami (error_msg.txt https://github.com/pandas-dev/pandas/files/1691837/error_msg.txt )

-
Anda menerima ini karena Anda berkomentar.
Balas email ini secara langsung, lihat di GitHub https://github.com/pandas-dev/pandas/issues/15086#issuecomment-362818153 , atau nonaktifkan utas https://github.com/notifications/unsubscribe-auth/ ABQHIpeYsj9Bv3OsoHAsOufXzU3AYSBSks5tRHPCgaJpZM4LeTSB .

Berbicara dengan Steve Dower hari ini, dan dia curiga ini mungkin baris yang bermasalah: https://github.com/pandas-dev/pandas/blob/e8f206d8192b409bc39da1ba1b2c5bcd8b65cc9f/pandas/_libs/src/parser/io.c#L30

IIUC, API sistem file Windows mengharapkan byte tersebut berada di MBCS, tetapi kami menggunakan utf-8.

Solusi tingkat pengguna adalah dengan secara eksplisit mengenkode nama file Anda sebagai mbcs sebelum meneruskan bytestring ke pandas. https://www.python.org/dev/peps/pep-0529/#explicitly -using-mbcs

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

adakah yang bisa menguji solusi itu?

hanya perlu sedikit perubahan pada kode parser untuk memperbaikinya (ada PR yang melakukan ini) tetapi telah dihapus

@TomAugspurger yang tidak berfungsi. read_csv mengharapkan str dan bukan bytes . Itu gagal dengan

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

Terima kasih sudah memeriksanya.

Pada Jum, 20 Apr 2018 pukul 15.43, João D. Ferreira [email protected]
menulis:

@TomAugspurger https://github.com/TomAugspurger yang tidak berfungsi.
read_csv mengharapkan str, bukan nilai byte. Itu gagal dengan

OSError: Nama jalur file yang diharapkan atau objek seperti file, dapatTipe

-
Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub
https://github.com/pandas-dev/pandas/issues/15086#issuecomment-383217062 ,
atau nonaktifkan utasnya
https://github.com/notifications/unsubscribe-auth/ABQHIiOHyt3sT7B0pHJuY5lB-cJtT5JHks5tqkiEgaJpZM4LeTSB
.

Hanya ping ini - Saya memiliki masalah yang sama, saya menggunakan solusi tetapi akan lebih bagus jika itu tidak diperlukan.

ini membutuhkan patch komunitas

Saya mengalami masalah ini. Saya ingin mencoba dan berkontribusi patchc Ada petunjuk tentang cara mulai memperbaiki ini?

Saya pikir tidak ada pengelola yang memiliki akses ke sistem yang dapat mereproduksi ini.

Mungkin beberapa dari orang lain dalam masalah ini dapat membantu menyusun solusi.

Hai, Saya mengalami masalah ini pada panda 1.0.3 sekarang dan solusi sys._enablelegacywindowsfsencoding() berhenti berfungsi. Saya memiliki ą dan ź di jalur file.
Saya mendapatkan kesalahan ini juga pada panda 0.25.3 tetapi 0.23.4 tampaknya berfungsi dengan baik saat menggunakan solusi (saya tidak memeriksa versi lain). Dengan senang hati saya akan memberikan informasi tambahan.

Hapus file dari nama folder yang sama seperti, jika file Anda disimpan dalam nama folder yang sama dengan file.
Hapus saja file dari folder itu.
jangan menyimpan file dengan nama folder yang sama.
kemudian, itu berhasil

@ pranjulknit Jika saya mengerti Anda menyarankan untuk memindahkan file ke folder tanpa karakter bermasalah ini di jalan. Ini tidak selalu memungkinkan. Jika Anda menyarankan bahwa nama folder dan nama file harus berbeda - ini bukan masalah yang dijelaskan di sini, saya tidak pernah mengalami masalah dengan itu.

Sebenarnya, saya mengalami masalah ini saat membaca file csv dari notebook jupyter.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat