Pandas: read_csv(filename_with_asian_locale) ist in Python 3.6 für Windows fehlgeschlagen

Erstellt am 5. Juni 2017  ·  3Kommentare  ·  Quelle: pandas-dev/pandas

Code:

Python 3.6.0 |Anaconda 4.3.1 (64-bit)| (default, Dec 23 2016, 11:57:41) [MSC v.1900 64 bit (AMD64)] on win32
>>> pd.__version__
'0.20.1'
>>> import platform
>>> platform.platform()
'Windows-7-6.1.7601-SP1'
>>> import pandas as pd
>>> df = pd.read_csv(r'c:\tmp\中文.csv')
Traceback (most recent call last):
  File "C:\ProgramData\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py", line 2881, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-6-0cd6317422e5>", line 1, in <module>
    df = pd.read_csv(r'c:\tmp\中文.csv')
  File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\io\parsers.py", line 655, in parser_f
    return _read(filepath_or_buffer, kwds)
  File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\io\parsers.py", line 405, in _read
    parser = TextFileReader(filepath_or_buffer, **kwds)
  File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\io\parsers.py", line 762, in __init__
    self._make_engine(self.engine)
  File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\io\parsers.py", line 966, in _make_engine
    self._engine = CParserWrapper(self.f, **self.options)
  File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\io\parsers.py", line 1582, in __init__
    self._reader = parsers.TextReader(src, **kwds)
  File "pandas\_libs\parsers.pyx", line 394, in pandas._libs.parsers.TextReader.__cinit__ (pandas\_libs\parsers.c:4209)
  File "pandas\_libs\parsers.pyx", line 712, in pandas._libs.parsers.TextReader._setup_parser_source (pandas\_libs\parsers.c:8895)
OSError: Initializing from file failed

Problembeschreibung

Python 3.6 hat sys.getfilesystemencoding() geändert, um "utf-8" anstelle von "mbcs" zurückzugeben
siehe PEP 529 .

Wie repariert man

Hier ist das Problem: parsers.pyx

if isinstance(source, basestring):
     if not isinstance(source, bytes):
         source = source.encode(sys.getfilesystemencoding() or 'utf-8')

Der Quellparameter ist unser Dateiname und wird in 'utf-8' codiert, nicht in 'mbcs' in Python 3.6
und schließlich an open() in io.c:new_file_source . übergeben
wird daher als mbcs-String interpretiert, daher ist die Ausnahme "Datei nicht gefunden" nicht überrascht
Vielleicht sollte dies die Verantwortung von Cython für Python 3.6 sein, um diese Dinge mit der Unicode-Version der Windows-API zu handhaben.
aber vorerst ersetzen wir einfach sys.getfilesystemencoding() durch "mbcs"

Duplicate IO CSV Unicode

Hilfreichster Kommentar

Es gibt eine Problemumgehung mit kompromittierter Geschwindigkeit:
python df = pd.read_csv(r'c:tmp中文.csv', engine='python' )

aber es ist eine schmutzige Arbeit, jeden einzelnen Aufruf von read_csv in all Ihren Projekten zu ändern

Alle 3 Kommentare

Es gibt eine Problemumgehung mit kompromittierter Geschwindigkeit:
python df = pd.read_csv(r'c:tmp中文.csv', engine='python' )

aber es ist eine schmutzige Arbeit, jeden einzelnen Aufruf von read_csv in all Ihren Projekten zu ändern

Dies ist ein Duplikat davon: https://github.com/pandas-dev/pandas/issues/15086

Es ist eine PR beigefügt, aber leider war sie weggeblasen.

würde das auf jeden Fall beheben.

Verwenden Sie keine chinesischen Namen für den Dateinamen, sondern ändern Sie ihn in Englisch.
Verwenden Sie NICHT das Chinesische im Dateinamen, ändern Sie es in Englisch.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen