熊猫阅读.csv文件
问题描述:
我有一个小脚本,使用从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
答
在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
已经提供了解码字符串。
现货,谢谢。任何想法为什么脚本工作在py_2.7没有编码,但不是在py_3.4? – Zak
在Python2.7中,'pd.read_csv'似乎将数据保留为字节。在Python3中,'pd.read_csv'尝试解码字节。 – unutbu