如何从文本文件中加载除换行符外还包含杂散回车符的numpy数组?

时间:2019-04-28 06:34:32

标签: python numpy

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

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

使用Python列表时,我可以使用iterating through files with carriage returns

中提到的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手动处理文件或使用{{ 1}}?

如果我尝试:

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视为只有一个条目的一行。

在Python 3.6.7,numpy 1.11.1,Ubuntu 18.04中进行了测试。

2 个答案:

答案 0 :(得分:2)

您可以使用选项loadtxt打开文件,而不是将文件名赋予newline='\n',并将文件处理程序赋予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)

答案 1 :(得分:0)

您可以尝试使用genfromtxt,它至少可以在您的小示例中起作用:

In [8]: import numpy
   ...: x, y = numpy.genfromtxt('mydat.dat', dtype=int, unpack=True, usecols=(0, 1,))
   ...: print(x)
   ...: print(y)
   ...: 
[1 2 3]
[1 2 3]