Python3 Pandas读取/导入CSV文件时的编码问题

4
我正在尝试使用Pandas读取电影数据集:http://files.grouplens.org/datasets/movielens/ml-100k/。我使用的是Python 3.4版本,并且遵循这里的教程
当我尝试使用那里提到的代码读取u.item数据时:
# the movies file contains columns indicating the movie's genres
# let's only load the first five columns of the file with usecols
m_cols = ['movie_id', 'title', 'release_date', 'video_release_date', 'imdb_url']
movies = pd.read_csv('ml-100k/u.item', sep='|', names=m_cols, usecols=range(5), encoding='UTF-8')

我得到了以下错误信息:"UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 3: invalid continuation byte"。

这个错误的可能原因是什么,有什么解决办法呢?

我尝试在pd.read_csv( encoding='utf-8' )中添加encoding='utf-8',但不幸的是它没有解决任何问题。

错误追踪如下:

---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
<ipython-input-4-4cc01a7faf02> in <module>()
      9 # let's only load the first five columns of the file with usecols
     10 m_cols = ['movie_id', 'title', 'release_date', 'video_release_date', 'imdb_url']
---> 11 movies = pd.read_csv('ml-100k/u.item', sep='|', names=m_cols, usecols=range(5), encoding='UTF-8')

/usr/local/lib/python3.4/site-packages/pandas/io/parsers.py in parser_f(filepath_or_buffer, sep, dialect, compression, doublequote, escapechar, quotechar, quoting, skipinitialspace, lineterminator, header, index_col, names, prefix, skiprows, skipfooter, skip_footer, na_values, na_fvalues, true_values, false_values, delimiter, converters, dtype, usecols, engine, delim_whitespace, as_recarray, na_filter, compact_ints, use_unsigned, low_memory, buffer_lines, warn_bad_lines, error_bad_lines, keep_default_na, thousands, comment, decimal, parse_dates, keep_date_col, dayfirst, date_parser, memory_map, float_precision, nrows, iterator, chunksize, verbose, encoding, squeeze, mangle_dupe_cols, tupleize_cols, infer_datetime_format, skip_blank_lines)
    472                     skip_blank_lines=skip_blank_lines)
    473 
--> 474         return _read(filepath_or_buffer, kwds)
    475 
    476     parser_f.__name__ = name

/usr/local/lib/python3.4/site-packages/pandas/io/parsers.py in _read(filepath_or_buffer, kwds)
    258         return parser
    259 
--> 260     return parser.read()
    261 
    262 _parser_defaults = {

/usr/local/lib/python3.4/site-packages/pandas/io/parsers.py in read(self, nrows)
    719                 raise ValueError('skip_footer not supported for iteration')
    720 
--> 721         ret = self._engine.read(nrows)
    722 
    723         if self.options.get('as_recarray'):

/usr/local/lib/python3.4/site-packages/pandas/io/parsers.py in read(self, nrows)
   1168 
   1169         try:
-> 1170             data = self._reader.read(nrows)
   1171         except StopIteration:
   1172             if nrows is None:

pandas/parser.pyx in pandas.parser.TextReader.read (pandas/parser.c:7544)()

pandas/parser.pyx in pandas.parser.TextReader._read_low_memory (pandas/parser.c:7784)()

pandas/parser.pyx in pandas.parser.TextReader._read_rows (pandas/parser.c:8617)()

pandas/parser.pyx in pandas.parser.TextReader._convert_column_data (pandas/parser.c:9928)()

pandas/parser.pyx in pandas.parser.TextReader._convert_tokens (pandas/parser.c:10714)()

pandas/parser.pyx in pandas.parser.TextReader._convert_with_dtype (pandas/parser.c:12118)()

pandas/parser.pyx in pandas.parser.TextReader._string_convert (pandas/parser.c:12283)()

pandas/parser.pyx in pandas.parser._string_box_utf8 (pandas/parser.c:17655)()

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 3: invalid continuation byte

尝试将参数 encoding='utf-8' 传递给 read_csv 函数。 - EdChum
尝试过了,我还是得到了相同的错误。 - Trinayan Baruah
请分享您的代码和精确的错误回溯。 - cel
3个回答

6

这是一个有点老的问题,但我想在这里分享一下,以防其他人遇到同样的问题,因为我在2018年11月也遇到了同样的问题。

我使用file -i检查了编码:

$ file -i u.item
u.item: text/plain; charset=iso-8859-1

然后将编码传递给pd.read_csv()函数。

>>> import pandas as pd
>>> df = pd.read_csv("u.item", sep="|", encoding="iso-8859-1")
>>> 

成功!


好的答案!如果pandas能够自动检测这个问题,那将是非常棒的。 - msemelman
仅使用 iso-8859-1 打开即可正常工作。 - liang

2

我发现两种可能的方法来解决这个问题:

1/ 用文本编辑器打开文件,并使用“UTF-8”编码保存文件

===> 例如,在Sublime Text中,按照以下选项卡:>>>"Edit" >>>"Save with encoding" >>> "UTF-8"

2/ 或者只需使用Python2打开文档...

没有找到更好的解决方案。


1
我希望澄清xb353的回答 - 应该是file -I u.item。否则,-i只会返回regular file或其他内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接