在Python中读取一个文件,该文件包含引起UTF-8和ASCII出错的恶意字节0xc0。

4 浏览
0 Comments

在Python中读取一个文件,该文件包含引起UTF-8和ASCII出错的恶意字节0xc0。

尝试将一个以制表符分隔的文件读入pandas的dataframe中:

>>> df = pd.read_table(fn , na_filter=False, error_bad_lines=False)

出现如下错误:

b'Skipping line 58: expected 11 fields, saw 12\n'
Traceback (most recent call last):
...(许多行)...
UnicodeDecodeError: 'utf-8'编解码器无法解码位置115的字节0xc0:起始字节无效

似乎字节0xc0在utf-8和ascii编码中都会引起问题。

>>> df = pd.read_table(fn , na_filter=False, error_bad_lines=False, encoding='ascii')
...(许多行)...
UnicodeDecodeError: 'ascii'编解码器无法解码位置115的字节0xc0:序数不在范围(128)内

我在使用csv模块的reader时遇到了同样的问题。

如果我将文件导入OpenOffice Calc中,它会正确导入,列会被正确识别等等。可能是因为那个有问题的0xc0字节在那里被忽略了。这不是数据的重要部分,可能只是生成该文件的系统出现了写入错误。如果必要的话,我甚至可以删除包含这个错误的那一行。我只是想将文件读入Python程序中。pandas的error_bad_lines=False选项本应该解决这个问题,但没有成功。此外,该文件中没有任何非英语脚本的内容,这使得unicode变得如此必要。全部都是标准的英文字母和数字。我还尝试了utf-16和utf-32等编码,但它们只会引发更多的错误。

如何使Python(特别是pandas的Dataframe)读取一个包含一个或多个问题字节0xc0的文件?

0
0 Comments

问题的原因是在Python中读取一个文件时遇到了一个恶意字节0xc0,导致utf-8和ascii编码出错。解决方法是使用编码为ISO-8859-1的标准来读取文件。需要确保文件的其余部分没有Unicode字符。这对于那些文件中本来就没有Unicode字符的人可能会有帮助,因为utf-8和ascii编码都会出错。ISO-8859-1编码对于字节0xc0是有效的,但对于范围0x80-0x9f是未定义的。另一个可以处理任意8位字节的编码是Windows代码页1252。在Python中使用encoding='cp1252'来指定编码参数。

以下是解决问题的代码示例:

import pandas as pd
df = pd.read_table(fn, na_filter=False, error_bad_lines=False, encoding='ISO-8859-1')

读取文件后,数据框(dataframe)的列和数据都能正常工作,就像在OpenOffice Calc中一样。虽然我仍然不知道那个有问题的0xc0字节去了哪里,但这已经不重要了,因为我已经得到了我需要的数据。

需要注意的是,虽然Windows代码页1252是一种流行的编码方式,但也备受诟病。在代码中,Python使用encoding='cp1252'来指定该编码方式,但也可以使用其他一些别名,如'windows-1252'。

这个问题的解决方法是根据特定的字节0xc0选择适当的编码方式进行文件读取,以确保能够成功加载文件并获取所需的数据。

0