Панды, читающие файлы.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 уже поставляет декодированные строки.

Другие вопросы по тегам