Pandas: OSError при чтении файла с акцентами в пути к файлу

Созданный на 9 янв. 2017  ·  27Комментарии  ·  Источник: pandas-dev/pandas

Образец кода, копируемый пример, если возможно

test.txt и test_é.txt - это один и тот же файл, меняется только имя:

pd.read_csv('test.txt')
Out[3]: 
   1 1 1
0  1 1 1
1  1 1 1

pd.read_csv('test_é.txt')
Traceback (most recent call last):

  File "<ipython-input-4-fd67679d1d17>", line 1, in <module>
    pd.read_csv('test_é.txt')

  File "d:\app\python36\lib\site-packages\pandas\io\parsers.py", line 646, in parser_f
    return _read(filepath_or_buffer, kwds)

  File "d:\app\python36\lib\site-packages\pandas\io\parsers.py", line 389, in _read
    parser = TextFileReader(filepath_or_buffer, **kwds)

  File "d:\app\python36\lib\site-packages\pandas\io\parsers.py", line 730, in __init__
    self._make_engine(self.engine)

  File "d:\app\python36\lib\site-packages\pandas\io\parsers.py", line 923, in _make_engine
    self._engine = CParserWrapper(self.f, **self.options)

  File "d:\app\python36\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

Описание проблемы

Pandas возвращает OSError при попытке прочитать файл с акцентами в пути к файлу.

Проблема новая (поскольку я обновился до Python 3.6 и Pandas 0.19.2)

Вывод pd.show_versions()

УСТАНОВЛЕННЫЕ ВЕРСИИ

коммит: Нет
питон: 3.6.0.final.0
биты Python: 64
ОС: Windows
ОС-релиз: 7
машина: AMD64
процессор: Intel64 Family 6 Model 94 Stepping 3, GenuineIntel
byteorder: маленький
LC_ALL: Нет
ЯЗЫК: fr
МЕСТО: Нет.

панды: 0.19.2
нос: нет
пункт: 9.0.1
setuptools: 32.3.1
Cython: 0,25,2
число: 1.11.3
scipy: 0.18.1
statsmodels: Нет
xarray: Нет
IPython: 5.1.0
сфинкс: 1.5.1
Пэтси: Нет
dateutil: 2.6.0
pytz: 2016.10
blosc: Нет
узкое место: 1.2.0
столы: Нет
numexpr: 2.6.1
matplotlib: 1.5.3
openpyxl: Нет
xlrd: Нет
xlwt: Нет
xlsxwriter: Нет
lxml: Нет
bs4: Нет
html5lib: 0,999999999
httplib2: Нет
apiclient: Нет
sqlalchemy: 1.1.4
pymysql: Нет
psycopg2: Нет
jinja2: 2.9.3
бото: нет
pandas_datareader: Нет

Bug IO CSV Unicode Windows

Самый полезный комментарий

Если кто-то приходит сюда, как я, потому что он / она столкнулся с той же проблемой, вот решение, пока pandas не будет исправлен для работы с pep 529 (в основном, любые символы, отличные от ascii, будут на вашем пути или в имени файла, приведут к ошибкам):

Вставьте следующие две строки в начало кода, чтобы вернуться к старому способу обработки путей в Windows:

import sys
sys._enablelegacywindowsfsencoding()

Все 27 Комментарий

Просто мои гроши стоят. Быстро опробовал на Mac OSX и Ubuntu без
проблемы. Смотри ниже.

Может ли это быть проблемой среды / платформы? Я заметил, что LOCALE - это
установлен в None.None . К сожалению, у меня нет Windows-машины, чтобы попробовать это
пример на. По общему признанию, это не объясняет, почему вы видели это после
обновитесь до python3.6 и pandas 0.19.2.

Примечание: я только что установил virtualenv с python3.6 и установил pandas 0.19.2 с помощью pip.

>>> import pandas as pd
>>> pd.read_csv('test_é.txt')
   a  b  c
0  1  2  3
1  4  5  6

Вывод pd.show_versions ()


УСТАНОВЛЕННЫЕ ВЕРСИИ

коммит: Нет
питон: 3.6.0.final.0
биты Python: 64
ОС: Linux
Релиз ОС: 4.4.0-57-generic
машина: x86_64
процессор: x86_64
byteorder: маленький
LC_ALL: Нет
ЯЗЫК: en_GB.UTF-8
МЕСТО: en_GB.UTF-8

панды: 0.19.2
нос: нет
пункт: 9.0.1
setuptools: 32.3.1
Cython: Нет
число: 1.11.3
scipy: Нет
statsmodels: Нет
xarray: Нет
IPython: нет
сфинкс: нет
Пэтси: Нет
dateutil: 2.6.0
pytz: 2016.10
blosc: Нет
узкое место: нет
столы: Нет
numexpr: нет
matplotlib: Нет
openpyxl: Нет
xlrd: Нет
xlwt: Нет
xlsxwriter: Нет
lxml: Нет
bs4: Нет
html5lib: Нет
httplib2: Нет
apiclient: Нет
sqlalchemy: Нет
pymysql: Нет
psycopg2: Нет
jinja2: Нет
бото: нет
pandas_datareader: Нет

Я считаю, что 3.6 переключает кодировку файловой системы в Windows на utf8 (из ascii). Кроме того, у нас еще нет возможности тестирования для Windows для 3.6 (поскольку некоторые из необходимых пакетов только сейчас становятся доступными).

@JGoutin

поэтому я только что добавил поддержку сборки в appveyor (windows) для версии 3.6, так что, если вы запустите свои тесты, чтобы увидеть, работает ли это, было бы здорово.

Я также столкнулся с той же проблемой, когда программа остановилась на pd.read_csv (file_path). Ситуация похожа на меня после того, как я обновил свой питон до 3.6 (я не уверен, что в последний раз установленный мной питон - это именно та версия, может быть, 3.5 ...).

@jreback какой следующий шаг к исправлению здесь?
Вы упомянули пиар, который «улетел» - что это значит?

Хотя я не использую Windows, я мог бы попытаться помочь (только что получил виртуальную машину для отладки фрагмента моего кода, который, по-видимому, не работает в Windows)

Кстати, обходной путь: передайте дескриптор файла вместо имени
pd.read_csv(open('test_é.txt', 'r'))
(есть несколько способов решения связанных проблем, но я не видел этого)

@tpietruszka см. комментарии к PR: https://github.com/pandas-dev/pandas/pull/15092 (он был удален из приватной вилки, там было довольно много).

вам в основном нужно кодировать пути по-разному на py3.6 (по сравнению с другими питонами) на wnidows. в основном необходимо реализовать: https://docs.python.org/3/whatsnew/3.6.html#pep -529-change-windows-filesystem-encoding-to-utf-8

мой старый код (не могу работать):

import pandas as pd
import os
file_path='./dict/字典.csv'
df_name = pd.read_csv(file_path,sep=',' )

новый код (успешно):

import pandas as pd
import os
file_path='./dict/dict.csv'
df_name = pd.read_csv(file_path,sep=',' )

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

Если кто-то приходит сюда, как я, потому что он / она столкнулся с той же проблемой, вот решение, пока pandas не будет исправлен для работы с pep 529 (в основном, любые символы, отличные от ascii, будут на вашем пути или в имени файла, приведут к ошибкам):

Вставьте следующие две строки в начало кода, чтобы вернуться к старому способу обработки путей в Windows:

import sys
sys._enablelegacywindowsfsencoding()

Я использую вышеуказанное решение, и оно работает. Большое спасибо @fotisj !
Однако я все еще не понимаю, почему DataFrame.to_csv () не вызывает такой же проблемы. Другими словами, для пути к файлу в формате Unicode запись разрешена, а чтение - нет.

путь = os.path.join ('E: \ 语料', 'sina.csv')
pd.read_csv (open (путь, 'r', кодировка = 'utf8'))

Это успешно.

Может ли кто-нибудь с затронутой системой проверить, изменяет ли эта строка

https://github.com/pandas-dev/pandas/blob/e8620abc12a4c468a75adb8607fd8e0eb1c472e7/pandas/io/common.py#L209

к

 return _expand_user(os.fsencode(filepath_or_buffer)), None, compression

это исправляет?

Нет.
Результат: OSError: Ожидаемое имя пути к файлу или файловый объект, получентип
(в Windows 10)

    OSError                                   Traceback (most recent call last)
    <ipython-input-2-e8247998d6d4> in <module>()
      1 
----> 2 df = pd.read_csv(r'D:\mydata\Dropbox\uni\progrs\test öäau\n\teu.csv', sep='\t')

C:\conda\lib\site-packages\pandas\io\parsers.py in parser_f(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, squeeze, prefix, mangle_dupe_cols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, dayfirst, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, escapechar, comment, encoding, dialect, tupleize_cols, error_bad_lines, warn_bad_lines, skipfooter, skip_footer, doublequote, delim_whitespace, as_recarray, compact_ints, use_unsigned, low_memory, buffer_lines, memory_map, float_precision)
    707                     skip_blank_lines=skip_blank_lines)
    708 
--> 709         return _read(filepath_or_buffer, kwds)
    710 
    711     parser_f.__name__ = name

C:\conda\lib\site-packages\pandas\io\parsers.py in _read(filepath_or_buffer, kwds)
    447 
    448     # Create the parser.
--> 449     parser = TextFileReader(filepath_or_buffer, **kwds)
    450 
    451     if chunksize or iterator:

C:\conda\lib\site-packages\pandas\io\parsers.py in __init__(self, f, engine, **kwds)
    816             self.options['has_index_names'] = kwds['has_index_names']
    817 
--> 818         self._make_engine(self.engine)
    819 
    820     def close(self):

C:\conda\lib\site-packages\pandas\io\parsers.py in _make_engine(self, engine)
   1047     def _make_engine(self, engine='c'):
   1048         if engine == 'c':
-> 1049             self._engine = CParserWrapper(self.f, **self.options)
   1050         else:
   1051             if engine == 'python':

C:\conda\lib\site-packages\pandas\io\parsers.py in __init__(self, src, **kwds)
   1693         kwds['allow_leading_cols'] = self.index_col is not False
   1694 
-> 1695         self._reader = parsers.TextReader(src, **kwds)
   1696 
   1697         # XXX

pandas/_libs/parsers.pyx in pandas._libs.parsers.TextReader.__cinit__()

pandas/_libs/parsers.pyx in pandas._libs.parsers.TextReader._setup_parser_source()

OSError: Expected file path name or file-like object, got <class 'bytes'> type

Ой, извини. Fsdecode там работает?


От: Фотис Джаннидис [email protected]
Отправлено: суббота, 3 февраля 2018 г., 8:00:13
Кому: pandas-dev / pandas
Копия: Том Аугспургер; Комментарий
Тема: Re: [pandas-dev / pandas] Ошибка OSError при чтении файла с акцентами в пути к файлу (# 15086)

Нет.
Результат: OSError: Ожидаемое имя пути к файлу или файловый объект, получентип

-
Вы получили это, потому что оставили комментарий.
Ответьте на это письмо напрямую, просмотрите его на GitHub https://github.com/pandas-dev/pandas/issues/15086#issuecomment-362809602 или отключите поток https://github.com/notifications/unsubscribe-auth/ ABQHIplv8thHxpjsP3knUCpET0Fjy0kLks5tRGZsgaJpZM4LeTSB .

Нет. Использование fsdecode приводит к той же ошибке, которая была у нас изначально ( error_msg.txt )

Хорошо, спасибо за попытку.


От: Фотис Джаннидис [email protected]
Отправлено: суббота, 3 февраля 2018 г., 8:57:07
Кому: pandas-dev / pandas
Копия: Том Аугспургер; Комментарий
Тема: Re: [pandas-dev / pandas] Ошибка OSError при чтении файла с акцентами в пути к файлу (# 15086)

Нет. Использование fsdecode приводит к той же ошибке, которая была у нас изначально (error_msg.txt https://github.com/pandas-dev/pandas/files/1691837/error_msg.txt )

-
Вы получили это, потому что оставили комментарий.
Ответьте на это письмо напрямую, просмотрите его на GitHub https://github.com/pandas-dev/pandas/issues/15086#issuecomment-362818153 или отключите поток https://github.com/notifications/unsubscribe-auth/ ABQHIpeYsj9Bv3OsoHAsOufXzU3AYSBSks5tRHPCgaJpZM4LeTSB .

Сегодня поговорил со Стивом Дауэром, и он подозревает, что это может быть проблемная строка: https://github.com/pandas-dev/pandas/blob/e8f206d8192b409bc39da1ba1b2c5bcd8b65cc9f/pandas/_libs/src/parserL30/io.c

IIUC, API файловой системы Windows ожидает, что эти байты будут в MBCS, но мы используем utf-8.

Обходной путь на уровне пользователя - явно закодировать ваше имя файла как mbcs перед передачей байтовой строки в pandas. https://www.python.org/dev/peps/pep-0529/#explicitly -using-mbcs

pd.read_csv(filename.encode('mbcs'))

Кто-нибудь может проверить это обходное решение?

просто нужно небольшое изменение в коде парсера, чтобы исправить это (это был PR), но был удален

@TomAugspurger, что не работает. read_csv ожидает значение str а не bytes . Это не срабатывает с

OSError: Expected file path name or file-like object, got <class 'bytes'> type

Спасибо за проверку.

Пт, 20 апреля 2018 г., в 15:43, Жоао Д. Феррейра [email protected]
написал:

@TomAugspurger https://github.com/TomAugspurger , который не работает.
read_csv ожидает значение str, а не байтов. Это не срабатывает с

OSError: ожидаемый путь к файлу или файловый объект, получентип

-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/pandas-dev/pandas/issues/15086#issuecomment-383217062 ,
или отключить поток
https://github.com/notifications/unsubscribe-auth/ABQHIiOHyt3sT7B0pHJuY5lB-cJtT5JHks5tqkiEgaJpZM4LeTSB
.

Просто проверьте это - у меня такая же проблема, я использую обходной путь, но было бы здорово, если бы это не требовалось.

для этого нужен патч сообщества

Я столкнулся с этой проблемой. Я хочу попробовать внести патч. Есть какие-нибудь указания о том, как это исправить?

Я думаю, что ни у кого из сопровождающих нет доступа к системе, которая может это воспроизвести.

Возможно, кто-то из участников этого вопроса поможет найти решение.

Привет, у меня есть эта проблема на pandas 1.0.3 сейчас, и обходной путь sys._enablelegacywindowsfsencoding() перестал работать. У меня есть ą и ź в пути к файлу.
Я получаю эту ошибку также на pandas 0.25.3 но 0.23.4 похоже, работает нормально при использовании обходного пути (я не проверял другие версии). Буду рад предоставить любую дополнительную информацию.

Удалите файл из папки с тем же именем, например, если ваш файл хранится в той же папке, что и файл.
Просто удалите файл из этой папки.
не храните файл в папке с тем же именем.
тогда это работает

@pranjulknit Если я понимаю, вы предлагаете переместить файл в папку без этих проблемных символов в пути. Это не всегда возможно. Если вы предлагаете, чтобы имена папок и файлов были разными - это не та проблема, которая описана здесь, у меня никогда не было проблем с этим.

На самом деле у меня эта проблема при чтении файла csv из ноутбука jupyter.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги