pandas.read_csv не может импортировать файл со знаком акцента в пути

Я разрабатываю приложение с Python и графическим интерфейсом QT. Мне нужно импортировать файл в DataFrame. Я использую QFileDialog.getOpenFileName, чтобы получить путь и имя файла, чтобы открыть его с помощью метода pandas.read_csv. Все работает хорошо, пока я не получу путь со специальными символами, такими как «ó». pandas.read_csv не работает и приводит к сбою приложения.

Я пытаюсь воспроизвести ошибку в консоли и получаю следующие результаты:

In[2]: import pandas as pd
Backend Qt5Agg is interactive backend. Turning interactive mode on.

In[3]: path1 = 'F:/Software_Proyects/Python/Proyectos/test_read_csv/FlowData.txt'
In[4]: df1 = pd.read_csv(path1, delim_whitespace=True, dtype=object)

In[5]: path2 = 'F:/Software_Proyects/Python/Proyectos/test_read_csv_with_ó/FlowData.txt'
In[6]: df2 = pd.read_csv(path2, delim_whitespace=True, dtype=object)
Traceback (most recent call last):
  File "C:\Program Files (x86)\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-feba8e024d43>", line 1, in <module>
    df2 = pd.read_csv(path2, delim_whitespace=True, dtype=object)
  File "C:\Program Files (x86)\Anaconda3\lib\site-packages\pandas\io\parsers.py", line 646, in parser_f
    return _read(filepath_or_buffer, kwds)
  File "C:\Program Files (x86)\Anaconda3\lib\site-packages\pandas\io\parsers.py", line 389, in _read
    parser = TextFileReader(filepath_or_buffer, **kwds)
  File "C:\Program Files (x86)\Anaconda3\lib\site-packages\pandas\io\parsers.py", line 730, in __init__
    self._make_engine(self.engine)
  File "C:\Program Files (x86)\Anaconda3\lib\site-packages\pandas\io\parsers.py", line 923, in _make_engine
    self._engine = CParserWrapper(self.f, **self.options)
  File "C:\Program Files (x86)\Anaconda3\lib\site-packages\pandas\io\parsers.py", line 1390, in __init__
    self._reader = _parser.TextReader(src, **kwds)
  File "pandas\parser.pyx", line 373, in pandas.parser.TextReader.__cinit__ (pandas\parser.c:4184)
  File "pandas\parser.pyx", line 669, in pandas.parser.TextReader._setup_parser_source (pandas\parser.c:8471)
OSError: Initializing from file failed

вывод show_versions():

In[7]: pd.show_versions()

INSTALLED VERSIONS
------------------
commit: None
python: 3.6.0.final.0
python-bits: 32
OS: Windows
OS-release: 10
machine: AMD64
processor: Intel64 Family 6 Model 78 Stepping 3, GenuineIntel
byteorder: little
LC_ALL: None
LANG: None
LOCALE: None.None

pandas: 0.19.2
nose: 1.3.7
pip: 9.0.1
setuptools: 27.2.0
Cython: 0.25.2
numpy: 1.11.3
scipy: 0.18.1
statsmodels: 0.6.1
xarray: None
IPython: 5.1.0
sphinx: 1.5.1
patsy: 0.4.1
dateutil: 2.6.0
pytz: 2016.10
blosc: None
bottleneck: 1.2.0
tables: 3.2.2
numexpr: 2.6.1
matplotlib: 2.0.0
openpyxl: 2.4.1
xlrd: 1.0.0
xlwt: 1.2.0
xlsxwriter: 0.9.6
lxml: 3.7.2
bs4: 4.5.3
html5lib: None
httplib2: None
apiclient: None
sqlalchemy: 1.1.5
pymysql: None
psycopg2: None
jinja2: 2.9.4
boto: 2.45.0
pandas_datareader: None

Как я прочитал в этом сообщении Кодирование с помощью pandas.read_csv, когда имя файла имеет диакритические знаки проблема была исправлена ​​в pandas 0.14.0.

Любая рекомендация для решения этой проблемы?


person jmejias    schedule 10.09.2017    source источник
comment
Попробуйте pd.read_csv(path1, delim_whitespace=True, dtype=object,encoding='utf-8') или что-то другое из этого списка: docs.python.org/ 3/library/codecs.html#standard-encodings   -  person Protostome    schedule 10.09.2017
comment
вы можете проверить эту проблему   -  person MaxU    schedule 12.09.2017
comment
@Protostome, спасибо за ваш ответ, я пробовал, но это не работает. Я думаю, потому что параметр кодирования read_csv предназначен для содержимого файла, а не для пути к файлу. Файл импортируется без проблем, проблема возникает, когда путь к файлу содержит специальные символы   -  person jmejias    schedule 13.09.2017
comment
Спасибо @MaxU. Ваш комментарий указывает мне направление, чтобы найти решение, которое я опубликую ниже.   -  person jmejias    schedule 14.09.2017


Ответы (2)


При более глубоком рассмотрении такое поведение встречается в сочетании Python 3.6 и pandas.read_csv только в системах Windows.

Python 3.6 меняет кодировку файловой системы Windows с «mbcs» на «UTF-8». См. Python PEP 529. Используйте sys.getfilesystemencoding() для получения текущей кодировки файловой системы.

Я получаю некоторые решения по этому поводу:

1.- Используйте этот код, чтобы изменить все приложение, чтобы оно работало с предыдущей кодировкой Python ‹= 3.5 ("mbcs").

import sys
sys._enablelegacywindowsfsencoding()

2.- Передайте указатель файла на pandas.read_csv

with open(path2, 'r') as fp:
    df2 = pd.read_csv(fp, delim_whitespace=True, dtype=object)
person jmejias    schedule 14.09.2017
comment
Потрясающий! Этот ответ мне очень помог! Спасибо - person Clayton Tosatti; 23.04.2019

вы можете попробовать эти строки кода в своем ноутбуке/ipython перед чтением с кодировкой utf-8:

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

а затем при чтении вашего файла используйте эту строку, как предлагается в комментарии

pd.read_csv(path1, delim_whitespace=True, dtype=object,encoding='utf-8')
person Espoir Murhabazi    schedule 10.09.2017
comment
Привет @Espoir. Я пробовал эти команды, но они не работают, глядя, почему я обнаружил, что эти команды предназначены для Python 2. В Python 3 кодировка по умолчанию — «utf-8», а метод setdefaultencoding() был удален из модуля sys. Чтобы использовать reload(sys) на Python ›= 3.4, я следую этому примеру: stackoverflow.com/questions/961162/ - person jmejias; 14.09.2017