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
python 3.6 a modifié sys.getfilesystemencoding() pour renvoyer "utf-8" au lieu de "mbcs"
voir PEP 529 .
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"
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.
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