Pandas: read_csv(filename_with_asian_locale) gagal di python 3.6 untuk windows

Dibuat pada 5 Jun 2017  ·  3Komentar  ·  Sumber: pandas-dev/pandas

Kode:

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

Deskripsi masalah

python 3.6 mengubah sys.getfilesystemencoding() untuk mengembalikan "utf-8" alih-alih "mbcs"
lihat PEP 529 .

Bagaimana cara memperbaiki

Inilah masalahnya: parser.pyx

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

parameter sumber adalah nama file kami, dan akan dikodekan ke 'utf-8', bukan warisan 'mbcs' di python 3.6
dan akhirnya diteruskan ke open() di io.c:new_file_source
sehingga ditafsirkan sebagai string mbcs, jadi, pengecualian "File tidak ditemukan" tidak mengejutkan
mungkin ini harus menjadi tanggung jawab cython untuk python 3.6 untuk menangani hal-hal ini dengan menggunakan versi unicode dari windows API,
tapi untuk saat ini, kita hanya mengganti sys.getfilesystemencoding() menjadi "mbcs"

Duplicate IO CSV Unicode

Komentar yang paling membantu

ada solusi dengan kecepatan yang dikompromikan:
python df = pd.read_csv(r'c:tmp中文.csv', engine='python' )

tetapi itu adalah pekerjaan kotor untuk memodifikasi setiap panggilan ke read_csv di semua proyek Anda

Semua 3 komentar

ada solusi dengan kecepatan yang dikompromikan:
python df = pd.read_csv(r'c:tmp中文.csv', engine='python' )

tetapi itu adalah pekerjaan kotor untuk memodifikasi setiap panggilan ke read_csv di semua proyek Anda

ini adalah duplikat dari ini: https://github.com/pandas-dev/pandas/issues/15086

ada PR yang terpasang tapi sayangnya tertiup angin.

pasti akan mengambil perbaikan untuk ini.

Jangan gunakan nama Cina untuk nama file, tetapi ubah ke bahasa Inggris.
JANGAN gunakan bahasa Cina dalam nama file, ubah ke bahasa Inggris.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat