我从Kaggle下载了一个数据集,并尝试执行以下代码:
import pandas as pd
movie_data = pd.read_csv('moviemetadata.csv', encoding = 'utf-8', delimiter = ',', header=0, decimal = '.')
print(movie_data.info)
奇怪的是,当我尝试在Sublime Text或终端(我在Mac上)中运行它时,它将无法工作并且以下错误被抛出:
Traceback (most recent call last):
File ".../test.py", line 14, in <module>
print(movie_data.info) #UnicodeEncodeError: 'ascii' codec can't encode character '\xe5' in position 7356: ordinal not in range(128)
UnicodeEncodeError: 'ascii' codec can't encode character '\xf3' in position 7559: ordinal not in range(128)
我用Google搜索了这条错误消息并尝试找到修复程序,例如通过包含“encoding ='utf-8'”,但这并没有解决它。然后我尝试在jupyter中运行相同的代码,它完美无缺。我得到了我想要的输出。
有人知道导致这种情况的原因以及如何在终端中使用相同的代码吗?
其他信息:我在终端和jupyter中使用相同的Python版本,并且我使用utf-8编码专门保存了.csv。
答案 0 :(得分:1)
你必须这样做:
movie_data.info()
由于info()
是一种方法。
默认情况下,print
已将info()
输出到sys.stdout
,因此无需将其包含在print(movie_data.info)
来电中。
print
处理Jupyter而不是终端的原因可能是由于编码问题。当您尝试打印非字符串类型时,movie_data.info
基本上会尝试将对象转换为包含str()
或repr()
的字符串。由于repr(movie_data.info)
是MethodType
,即绑定方法,<bound method DataFrame.info of ...>
看起来像...
,其中info()
是数据帧的字符串表示形式。因为你的数据帧包含一些unicode值,所以它的字符串表示也是如此;如果在管道到stdout之前没有正确编码,可能会给你一个编码错误。 (see also)
movie_data.info()
的常规摘要输出似乎不包含任何单元格或索引值,而只包含列名称。除非您的数据帧列也可能包含unicode字符,否则您可以执行movie_data.columns = map(lambda s: s.encode('utf-8', 'ignore'), movie_data.columns)
movie_data.info()
,否则,首先对这些列进行编码的操作也应该有效:
datatype