熊猫阅读.csv文件

时间:2015-07-20 11:43:22

标签: python-2.7 parsing csv python-3.4

我有一个小脚本,可以使用从MS Excel生成的pandas来读取和打印.csv文件。

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 个答案:

答案 0 :(得分:0)

在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已经提供了已解码的字符串。