Pandas: OSError beim Lesen einer Datei mit Akzenten im Dateipfad

Erstellt am 9. Jan. 2017  ·  27Kommentare  ·  Quelle: pandas-dev/pandas

Codebeispiel, wenn möglich ein kopierfähiges Beispiel

test.txt und test_é.txt sind dieselbe Datei, nur die Namensänderung:

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

Problembeschreibung

Pandas geben OSError zurück, wenn sie versuchen, eine Datei mit Akzenten im Dateipfad zu lesen.

Das Problem ist neu (seit ich auf Python 3.6 und Pandas 0.19.2 aktualisiert habe)

Ausgabe von pd.show_versions()

INSTALLIERTE VERSIONEN

Festschreiben: Keine
Python: 3.6.0.final.0
Python-Bits: 64
Betriebssystem: Windows
Betriebssystem-Release: 7
Maschine: AMD64
Prozessor: Intel64 Family 6 Model 94 Stepping 3, GenuineIntel
Byteorder: wenig
LC_ALL: Keine
LANG: fr
LOCALE: Keine

Pandas: 0,19,2
Nase: Keine
pip: 9.0.1
setuptools: 32.3.1
Cython: 0,25,2
Anzahl: 1.11.3
scipy: 0.18.1
Statistikmodelle: Keine
xarray: Keine
IPython: 5.1.0
Sphinx: 1.5.1
Patsy: Keine
Datum: 2.6.0
pytz: 2016.10
blosc: Keine
Engpass: 1.2.0
Tabellen: Keine
numexpr: 2.6.1
matplotlib: 1.5.3
openpyxl: Keine
xlrd: Keine
xlwt: Keine
xlsxwriter: Keine
lxml: Keine
bs4: Keine
html5lib: 0.999999999
httplib2: Keine
apiclient: Keine
sqlalchemy: 1.1.4
pymysql: Keine
psycopg2: Keine
jinja2: 2.9.3
Boto: Keine
pandas_datareader: Keine

Bug IO CSV Unicode Windows

Hilfreichster Kommentar

Wenn jemand wie ich hierher kommt, weil er / sie das gleiche Problem hat, ist hier eine Lösung, bis pandas für die Arbeit mit pep 529 behoben ist (im Grunde führen alle Nicht-ASCII-Zeichen in Ihrem Pfad oder Dateiname zu Fehlern):

Fügen Sie die folgenden zwei Zeilen am Anfang Ihres Codes ein, um zur alten Methode der Behandlung von Pfaden in Windows zurückzukehren:

import sys
sys._enablelegacywindowsfsencoding()

Alle 27 Kommentare

Nur mein Cent wert. Schnell ausprobiert unter Mac OSX und Ubuntu ohne
Probleme. Siehe unten.

Könnte dies ein Umgebungs- / Plattformproblem sein? Mir ist aufgefallen, dass das LOCALE ist
auf None.None . Leider habe ich keine Windows-Maschine, um dies zu versuchen
Beispiel auf. Zugegeben, das würde nicht erklären, warum Sie das nach dem gesehen haben
Upgrade auf Python3.6 und Pandas 0.19.2.

Hinweis: Ich habe gerade eine virtuelle Umgebung mit Python3.6 eingerichtet und Pandas 0.19.2 mit Pip installiert.

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

Ausgabe von pd.show_versions ()


INSTALLIERTE VERSIONEN

Festschreiben: Keine
Python: 3.6.0.final.0
Python-Bits: 64
Betriebssystem: Linux
Betriebssystemversion: 4.4.0-57-generic
Maschine: x86_64
Prozessor: x86_64
Byteorder: wenig
LC_ALL: Keine
LANG: en_GB.UTF-8
LOCALE: en_GB.UTF-8

Pandas: 0,19,2
Nase: Keine
pip: 9.0.1
setuptools: 32.3.1
Cython: Keine
Anzahl: 1.11.3
scipy: Keine
Statistikmodelle: Keine
xarray: Keine
IPython: Keine
Sphinx: Keine
Patsy: Keine
Datum: 2.6.0
pytz: 2016.10
blosc: Keine
Engpass: Keine
Tabellen: Keine
numexpr: Keine
matplotlib: Keine
openpyxl: Keine
xlrd: Keine
xlwt: Keine
xlsxwriter: Keine
lxml: Keine
bs4: Keine
html5lib: Keine
httplib2: Keine
apiclient: Keine
sqlalchemy: Keine
pymysql: Keine
psycopg2: Keine
jinja2: Keine
Boto: Keine
pandas_datareader: Keine

Ich glaube, 3.6 schaltet die Dateisystemcodierung unter Windows auf utf8 (von ASCII) um. Abgesehen davon haben wir noch keine Testaktivierung für Windows 3.6 (da einige der erforderlichen Pakete gerade verfügbar sind).

@ JGoutin

Ich habe gerade Build-Unterstützung für Appveyor (Windows) für 3.6 hinzugefügt. Wenn Sie also Ihre Tests vorantreiben würden, um zu sehen, ob es funktioniert, wäre das großartig.

Ich hatte auch das gleiche Problem, als das Programm bei pd.read_csv (file_path) gestoppt wurde. Die Situation ist ähnlich wie nach dem Upgrade meines Pythons auf 3.6 (ich bin mir nicht sicher, ob das letzte Mal, das ich installiert habe, genau die Version ist, vielleicht 3.5 ......).

@jreback was ist der nächste Schritt in Richtung einer Lösung hier?
Sie haben eine PR erwähnt, die "umgehauen" wurde - was bedeutet das?

Obwohl ich Windows nicht verwende, könnte ich versuchen zu helfen (habe gerade eine VM zum Debuggen eines Teils meines Codes, der anscheinend unter Windows nicht funktioniert).

Übrigens, eine Problemumgehung: Übergeben Sie ein Dateihandle anstelle eines Namens
pd.read_csv(open('test_é.txt', 'r'))
(Es gibt mehrere Problemumgehungen in verwandten Bereichen, aber ich habe diese nicht gesehen.)

@tpietruszka siehe Kommentare zur PR: https://github.com/pandas-dev/pandas/pull/15092 (es wurde von einer privaten Gabel entfernt, war so ziemlich da).

Grundsätzlich müssen Sie die Pfade auf py3.6 (im Vergleich zu anderen Pythons) auf wnidows anders codieren. Grundsätzlich muss Folgendes implementiert werden: https://docs.python.org/3/whatsnew/3.6.html#pep -529-change-windows-filesystem-encoding-to-utf-8

Mein alter Code (kann nicht ausgeführt werden):

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

neuer Code (erfolgreich):

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

Ich denke, dieser Fehler ist ein Dateinamenproblem.
Ich ändere den Dateinamen von Chinesisch auf Englisch, er kann jetzt ausgeführt werden.

Wenn jemand wie ich hierher kommt, weil er / sie das gleiche Problem hat, ist hier eine Lösung, bis pandas für die Arbeit mit pep 529 behoben ist (im Grunde führen alle Nicht-ASCII-Zeichen in Ihrem Pfad oder Dateiname zu Fehlern):

Fügen Sie die folgenden zwei Zeilen am Anfang Ihres Codes ein, um zur alten Methode der Behandlung von Pfaden in Windows zurückzukehren:

import sys
sys._enablelegacywindowsfsencoding()

Ich benutze die obige Lösung und es funktioniert. Vielen Dank @fotisj !
Ich bin jedoch immer noch verwirrt darüber, warum DataFrame.to_csv () nicht dasselbe Problem aufweist. Mit anderen Worten, für den Unicode-Dateipfad ist das Schreiben in Ordnung, das Lesen nicht.

path = os.path.join ('E: \ 语料', 'sina.csv')
pd.read_csv (offen (Pfad, 'r', Kodierung = 'utf8'))

Es ist erfolgreich.

Kann jemand mit einem betroffenen System prüfen, ob diese Zeile geändert wird?

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

zu

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

behebt es?

Nein, tut es nicht.
Ergebnisse in: OSError: Erwarteter Dateipfadname oder dateiähnliches Objekt, erhaltenArt
(unter 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, das tut mir leid. Funktioniert fsdecode dort?


Von: Fotis Jannidis [email protected]
Gesendet: Samstag, 3. Februar 2018, 8:00:13 Uhr
An: pandas-dev / pandas
Cc: Tom Augspurger; Kommentar
Betreff: Betreff: [pandas-dev / pandas] OSError beim Lesen einer Datei mit Akzenten im Dateipfad (# 15086)

Nein, tut es nicht.
Ergebnisse in: OSError: Erwarteter Dateipfadname oder dateiähnliches Objekt, erhaltenArt

- -
Sie erhalten dies, weil Sie kommentiert haben.
Antworten Sie direkt auf diese E-Mail, zeigen Sie sie auf GitHub https://github.com/pandas-dev/pandas/issues/15086#issuecomment-362809602 an oder schalten Sie den Thread https://github.com/notifications/unsubscribe-auth/ stumm.

Nein. Die Verwendung von fsdecode erzeugt den gleichen Fehler, den wir ursprünglich hatten ( error_msg.txt ).

Ok, danke, dass du es versucht hast.


Von: Fotis Jannidis [email protected]
Gesendet: Samstag, 3. Februar 2018, 08:57:07 Uhr
An: pandas-dev / pandas
Cc: Tom Augspurger; Kommentar
Betreff: Betreff: [pandas-dev / pandas] OSError beim Lesen einer Datei mit Akzenten im Dateipfad (# 15086)

Nein. Die Verwendung von fsdecode führt zu demselben Fehler, den wir ursprünglich hatten (error_msg.txt https://github.com/pandas-dev/pandas/files/1691837/error_msg.txt ).

- -
Sie erhalten dies, weil Sie kommentiert haben.
Antworten Sie direkt auf diese E-Mail, zeigen Sie sie auf GitHub https://github.com/pandas-dev/pandas/issues/15086#issuecomment-362818153 an oder schalten Sie den Thread https://github.com/notifications/unsubscribe-auth/ stumm.

Ich habe heute mit Steve Dower gesprochen und vermutet, dass dies die problematische Zeile ist: https://github.com/pandas-dev/pandas/blob/e8f206d8192b409bc39da1ba1b2c5bcd8b65cc9f/pandas/_libs/src/parser/io.c#L

IIUC, die Windows-Dateisystem-API erwartet, dass sich diese Bytes im MBCS befinden, aber wir verwenden utf-8.

Eine Problemumgehung auf Benutzerebene besteht darin, Ihren Dateinamen explizit als mbcs zu codieren, bevor Sie den Bytestring an Pandas übergeben. https://www.python.org/dev/peps/pep-0529/#explicitly -using-mbcs

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

Kann jemand diese Problemumgehung testen?

Ich brauche nur eine kleine Änderung im Parser-Code, um dies zu beheben (es gab einen PR, der dies tat), wurde aber gelöscht

@ TomAugspurger , der nicht funktioniert. read_csv erwartet einen str und keinen Wert von bytes . Es scheitert mit

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

Danke für das Kontrollieren.

Am Freitag, den 20. April 2018 um 15:43 Uhr, João D. Ferreira [email protected]
schrieb:

@ TomAugspurger https://github.com/TomAugspurger , der nicht funktioniert.
read_csv erwartet einen str- und keinen bytewert. Es scheitert mit

OSError: Erwarteter Dateipfadname oder dateiähnliches Objekt, erhaltenArt

- -
Sie erhalten dies, weil Sie erwähnt wurden.
Antworte direkt auf diese E-Mail und sieh sie dir auf GitHub an
https://github.com/pandas-dev/pandas/issues/15086#issuecomment-383217062 ,
oder schalten Sie den Thread stumm
https://github.com/notifications/unsubscribe-auth/ABQHIiOHyt3sT7B0pHJuY5lB-cJtT5JHks5tqkiEgaJpZM4LeTSB
.

Pingen Sie einfach an - ich habe das gleiche Problem, ich verwende eine Problemumgehung, aber es wäre großartig, wenn dies nicht erforderlich wäre.

Dies erfordert einen Community-Patch

Ich stoße auf dieses Problem. Ich möchte versuchen, einen Patchc beizusteuern. Gibt es Hinweise, wie Sie mit der Behebung dieses Problems beginnen können?

Ich denke, keiner der Betreuer hat Zugriff auf ein System, das dies reproduzieren kann.

Vielleicht können einige der anderen in dieser Ausgabe helfen, eine Lösung zusammenzustellen.

Hallo, ich habe dieses Problem bei Pandas 1.0.3 jetzt und sys._enablelegacywindowsfsencoding() Workaround funktioniert nicht mehr. Ich habe ą und ź im Dateipfad.
Ich erhalte diesen Fehler auch bei Pandas 0.25.3 aber 0.23.4 scheint bei Verwendung der Problemumgehung einwandfrei zu funktionieren (ich habe andere Versionen nicht überprüft). Gerne stelle ich Ihnen weitere Informationen zur Verfügung.

Entfernen Sie die Datei aus demselben Ordnernamen wie, wenn Ihre Datei im selben Ordnernamen wie die Datei gespeichert ist.
Entfernen Sie einfach die Datei aus diesem Ordner.
Speichern Sie die Datei nicht im selben Ordnernamen.
dann funktioniert es

@pranjulknit Wenn ich verstehe, schlagen Sie vor, die Datei in einen Ordner ohne diese problematischen Zeichen im Pfad zu verschieben. Dies ist nicht immer möglich. Wenn Sie vorschlagen, dass Ordnernamen und Dateinamen unterschiedlich sein sollten - dies ist nicht das hier beschriebene Problem, ich hatte nie Probleme damit.

Eigentlich habe ich dieses Problem beim Lesen der CSV-Datei aus dem Jupiter-Notebook.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen