首页 > 解决方案 > 除了换行符之外,如何从包含杂散回车符的文本文件中加载 numpy 数组?

问题描述

我有一个包含杂散回车的换行符分隔的数据文件,例如:

printf '1 1 string1
2 2 str\ring2
3 3 string3
' > mydat.dat

使用 Python 列表时,我可以使用以下方法正确处理此文件newline='\n'使用回车遍历文件

#!/usr/bin/env python3
xs = []
ys = []
labels = []
with open('mydat.dat', 'r', newline='\n') as f:
    for line in f:
        x, y, label = line.split(' ')
        xs.append(int(x))
        ys.append(int(y))
        labels.append(label)
print(xs)
print(ys)
print(repr(labels))

打印所需的:

[1, 2, 3]
[1, 2, 3]
['string1\n', 'str\ring2\n', 'string3\n']

我的问题是,numpy.loatxt或类似的便捷功能是否有能力以类似方式处理回车,而不会强迫我手动处理文件open,或预处理文件dos2unix

如果我尝试:

#!/usr/bin/env python3
import numpy
x, y = numpy.loadtxt('mydat.dat', dtype=int, unpack=True, usecols=(0, 1,))
print(x)
print(y)

然后它失败了:

Traceback (most recent call last):
  File "./main.py", line 5, in <module>
    x, y = numpy.loadtxt('mydat.dat', unpack=True, usecols=(0, 1,))
  File "/home/ciro/.local/lib/python3.6/site-packages/numpy/lib/npyio.py", line 1141, in loadtxt
    for x in read_data(_loadtxt_chunksize):
  File "/home/ciro/.local/lib/python3.6/site-packages/numpy/lib/npyio.py", line 1061, in read_data
    vals = [vals[j] for j in usecols]
  File "/home/ciro/.local/lib/python3.6/site-packages/numpy/lib/npyio.py", line 1061, in <listcomp>
    vals = [vals[j] for j in usecols]
IndexError: list index out of range

因为当它到达 时2 2 str\ring2,它被视为ing2具有单个条目的行。

在 Python 3.6.7、numpy 1.11.1、Ubuntu 18.04 中测试。

标签: pythonnumpy

解决方案


loadtxt您可以使用选项打开文件,而不是将文件名newline='\n'提供给 numpy ,并将文件处理程序提供给 numpy

with open('mydat.dat', 'r', newline='\n') as f:
    x, y = numpy.loadtxt(f, dtype=int, unpack=True, usecols=(0, 1,))
print(x)
print(y)

推荐阅读