pandas.read_csv()在jupyter中工作但不在终端中工作

时间:2017-11-16 13:58:46

标签: python pandas jupyter-notebook

我从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。

1 个答案:

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