【问题标题】:numpy loadtxt, unicode, and python 2 or 3numpy loadtxt、unicode 和 python 2 或 3
【发布时间】:2014-05-21 03:13:57
【问题描述】:

我有一个(windows)文本文件被 linux 报告为:

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

我想将它读入 numpy,除了包含标签的第一行(带有特殊字符,通常只有希腊语 mu)。

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

对我来说,这是“错误”的行为,原因如下:

  1. 我想跳过第一行,因此无论其编码如何,都应该忽略它
  2. 如果我从文件中删除第一行,loadtxt 在两个版本的 python 中都可以正常工作
  3. numpy.loadtxt 在 python2 和 python3 中的行为不应该相同吗?

问题:

  • 如何解决这个问题(当然是使用 python3)?
  • 我应该提交错误报告还是这是预期的行为?

【问题讨论】:

  • 你用genfromtxt()得到同样的结果吗?
  • 不! genfromtxt() 有效。谢谢!
  • 我在 NumPy 的 GitHub 中创建了this issue

标签: python python-3.x numpy unicode


【解决方案1】:

这似乎是loadtxt() 中的一个错误,请尝试改用genfromtxt()

【讨论】:

    【解决方案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 似乎不会发生在文件的开头。您确定您的文件不包含一些不可见或看起来像空格但实际上不是的奇怪符号吗?

    【讨论】:

    • 我不是 100% 确定文件中到底是什么,尽管它看起来像制表符分隔的数字(其中一些是科学计数法),并且 linux file 命令似乎同意。此外,使用 :set list 在 vi​​m 中看起来“正常”,但我没有查看这些 200KB 文件中的每个单独字符...如果错误消息中的“位置”指的是字节,这是第一行:行很长。
    • 您可以尝试重新生成文件:使用 Python 读取它,解析,转换为数字,然后将它们写回。它将解决所有格式问题。或者只是使用正则表达式来搜索既不是空格也不是数字的任何内容。
    猜你喜欢
    • 2014-01-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2015-09-29
    • 2023-01-12
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多