Панды, читающие файлы.csv
У меня есть небольшой скрипт для чтения и печати файла.csv с использованием панд, сгенерированных из MS Excel.
import pandas as pd
data = pd.read_csv('./2010-11.csv')
print(data)
теперь этот скрипт выполняется в Python 2.7.8, но в Python 3.4.1 выдает следующую ошибку. Есть идеи, почему это может быть так? Заранее спасибо за любую помощь с этим.
Traceback (most recent call last):
File "proc_csv_0-0.py", line 3, in <module>
data = pd.read_csv('./2010-11.csv')
File "/usr/lib64/python3.4/site-packages/pandas/io/parsers.py", line 474, in parser_f
return _read(filepath_or_buffer, kwds)
File "/usr/lib64/python3.4/site-packages/pandas/io/parsers.py", line 260, in _read
return parser.read()
File "/usr/lib64/python3.4/site-packages/pandas/io/parsers.py", line 721, in read
ret = self._engine.read(nrows)
File "/usr/lib64/python3.4/site-packages/pandas/io/parsers.py", line 1170, in read
data = self._reader.read(nrows)
File "pandas/parser.pyx", line 769, in pandas.parser.TextReader.read (pandas/parser.c:7566)
File "pandas/parser.pyx", line 791, in pandas.parser.TextReader._read_low_memory (pandas/parser.c:7806)
File "pandas/parser.pyx", line 866, in pandas.parser.TextReader._read_rows (pandas/parser.c:8639)
File "pandas/parser.pyx", line 973, in pandas.parser.TextReader._convert_column_data (pandas/parser.c:9950)
File "pandas/parser.pyx", line 1033, in pandas.parser.TextReader._convert_tokens (pandas/parser.c:10737)
File "pandas/parser.pyx", line 1130, in pandas.parser.TextReader._convert_with_dtype (pandas/parser.c:12141)
File "pandas/parser.pyx", line 1150, in pandas.parser.TextReader._string_convert (pandas/parser.c:12355)
File "pandas/parser.pyx", line 1382, in pandas.parser._string_box_utf8 (pandas/parser.c:17679)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc9 in position 4: unexpected end of data
1 ответ
В Python3, когда pd.read_csv
передается путь к файлу (в отличие от файлового буфера), он декодирует содержимое с utf-8
кодек по умолчанию.1 Похоже, ваш CSV-файл использует другую кодировку. Так как это было сгенерировано MS Excel, это может быть cp-1252:
In [25]: print('\xc9'.decode('cp1252'))
É
In [27]: import unicodedata as UDAT
In [28]: UDAT.name('\xc9'.decode('cp1252'))
Out[28]: 'LATIN CAPITAL LETTER E WITH ACUTE'
Сообщение об ошибке
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc9
Говорит, что '\xc9'.decode('utf-8')
вызывает UnicodeDecodeError.
Вышеуказанный байт 0xc9 может быть декодирован с cp1252
, Еще неизвестно, можно ли декодировать оставшуюся часть файла с помощью cp1252
и если это даст желаемый результат.
К сожалению, учитывая только файл, нет точного способа определить, какая кодировка (если она есть) была использована. Это полностью зависит от программы, используемой для создания файла.
Если cp1252
правильная кодировка, чтобы загрузить файл в использование DataFrame
data = pd.read_csv('./2010-11.csv', encoding='cp1252')
1 Когда pd.read_csv
передается буфер, буфер мог быть открыт с encoding
уже установлено:
# Python3
with open('/tmp/test.csv', 'r', encoding='cp1252') as f:
df = pd.read_csv(f)
print(df)
в таком случае pd.read_csv
не будет пытаться декодировать, так как буфер f
уже поставляет декодированные строки.