Pandas: read_csv(filename_with_asian_locale) a échoué dans python 3.6 pour Windows

Créé le 5 juin 2017  ·  3Commentaires  ·  Source: 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

Description du problème

python 3.6 a modifié sys.getfilesystemencoding() pour renvoyer "utf-8" au lieu de "mbcs"
voir PEP 529 .

Comment réparer

Voici le problème : parsers.pyx

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

le paramètre source est notre nom de fichier et sera encodé en 'utf-8', pas en 'mbcs' hérité en python 3.6
et finalement passé à open() dans io.c:new_file_source
donc interprétée comme une chaîne mbcs, donc, l'exception "Fichier non trouvé" n'est pas surprise
peut-être que cela devrait être la responsabilité de cython pour python 3.6 de gérer ces choses en utilisant la version unicode de l'API Windows,
mais pour l'instant, nous remplaçons simplement sys.getfilesystemencoding() par "mbcs"

Duplicate IO CSV Unicode

Commentaire le plus utile

il existe une solution de contournement avec la vitesse compromise :
python df = pd.read_csv(r'c:tmp中文.csv', engine='python' )

mais c'est un sale boulot de modifier chaque appel à read_csv dans tous vos projets

Tous les 3 commentaires

il existe une solution de contournement avec la vitesse compromise :
python df = pd.read_csv(r'c:tmp中文.csv', engine='python' )

mais c'est un sale boulot de modifier chaque appel à read_csv dans tous vos projets

c'est un duplicata de ceci : https://github.com/pandas-dev/pandas/issues/15086

il y a un PR attaché mais malheureusement il a été époustouflé.

prendrait certainement une solution pour cela.

N'utilisez pas de noms chinois pour le nom de fichier, mais changez-le en anglais.
N'utilisez PAS le chinois dans le nom du fichier, changez-le en anglais.

Cette page vous a été utile?
0 / 5 - 0 notes