2015-07-20 181 views
0

我有一个小脚本,使用从MS Excel生成的熊猫来阅读和打印.csv文件。熊猫阅读.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 

回答

0

在Python3,当pd.read_csv被传递的文件路径(而不是一个文件缓冲器)进行解码与所述编解码器utf-8默认的内容。 您的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是正确的编码,然后将文件加载到数据帧使用

data = pd.read_csv('./2010-11.csv', encoding='cp1252') 

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不会尝试d ecode,因为缓冲区f已经提供了解码字符串。

+0

现货,谢谢。任何想法为什么脚本工作在py_2.7没有编码,但不是在py_3.4? – Zak

+0

在Python2.7中,'pd.read_csv'似乎将数据保留为字节。在Python3中,'pd.read_csv'尝试解码字节。 – unutbu