我有一个小脚本,可以使用从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
答案 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
已经提供了已解码的字符串。