Pandas: read_csv (filename_with_asian_locale) falló en Python 3.6 para Windows

Creado en 5 jun. 2017  ·  3Comentarios  ·  Fuente: pandas-dev/pandas

Código:

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

Descripción del problema

python 3.6 cambió sys.getfilesystemencoding () para devolver "utf-8" en lugar de "mbcs"
ver PEP 529 .

Como arreglar

Aquí está el problema: parsers.pyx

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

el parámetro de origen es nuestro nombre de archivo y se codificará en 'utf-8', no en 'mbcs' heredados en Python 3.6
y finalmente pasó a open () en io.c: new_file_source
por lo tanto, se interpreta como una cadena mbcs, por lo que la excepción "Archivo no encontrado" no se sorprende
tal vez esta debería ser la responsabilidad de cython para python 3.6 para manejar estas cosas utilizando la versión unicode de la API de Windows,
pero por ahora, simplemente reemplazamos sys.getfilesystemencoding () por "mbcs"

Duplicate IO CSV Unicode

Comentario más útil

hay una solución con la velocidad comprometida:
python df = pd.read_csv (r'c: tmp 中文 .csv ', motor =' python ' )

pero es un trabajo sucio modificar cada llamada a read_csv en todos sus proyectos

Todos 3 comentarios

hay una solución con la velocidad comprometida:
python df = pd.read_csv (r'c: tmp 中文 .csv ', motor =' python ' )

pero es un trabajo sucio modificar cada llamada a read_csv en todos sus proyectos

esto es un duplicado de esto: https://github.com/pandas-dev/pandas/issues/15086

hay un PR adjunto, pero desafortunadamente quedó impresionado.

ciertamente tomaría una solución para esto.

No utilice nombres chinos para el nombre del archivo, cámbielo a inglés.
NO use el chino en el nombre del archivo, cámbielo a inglés.

¿Fue útil esta página
0 / 5 - 0 calificaciones