numpy loadtxt,Unicode,以及Python 2或3

3 投票
2 回答
4247 浏览
提问于 2025-04-18 01:51

我有一个在Linux上被报告为某种格式的(Windows)文本文件:

ISO-8859 text, with very long lines, with CRLF line terminators

我想把这个文件读入到numpy中,但第一行是标签,里面有一些特殊字符(通常只有希腊字母μ),我不想读这行。

在Python 2.7.6和Numpy 1.8.0下,这样做完全没问题:

data = np.loadtxt('input_file.txt', skiprows=1)

但是在Python 3.4.0和Numpy 1.8.0下,就出现了错误:

>>> np.loadtxt('input_file.txt', skiprows=1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.4/site-packages/numpy/lib/npyio.py", line 796, in loadtxt
    next(fh)
  File "/usr/lib/python3.4/codecs.py", line 313, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb5 in position 4158: invalid start byte

我觉得这有点“bug”的表现,原因如下:

  1. 我想跳过第一行,所以它应该被忽略,不管它的编码是什么。
  2. 如果我把文件的第一行删掉,loadtxt在两个版本的Python中都能正常工作。
  3. 难道numpy.loadtxt在Python 2和Python 3中不应该表现一致吗?

问题:

  • 如何解决这个问题(当然是用Python 3)?
  • 我应该提交一个bug报告,还是说这是正常现象?

2 个回答

2

是的,这看起来是Numpy中的一个错误——它在跳过某些行时还试图解析内容,但结果失败了。最好把这个问题报告一下。
根据文档,loadtxt的第一个参数可以是文件对象或者字符串生成器。你可以试试这个方法。

f = open ('load_file.txt')
f.readline()
data = np.loadtxt(f)

另外,错误信息'utf-8' codec can't decode byte 0xb5 in position 4158似乎不是出现在文件的开头。你确定你的文件里没有一些看不见的奇怪符号吗?这些符号可能看起来像空格,但实际上并不是空格。

3

看起来在 loadtxt() 这个函数里有个问题,试试用 genfromtxt() 代替它吧。

撰写回答