python - 如何从包含杂散回车符和换行符的文本文件加载 numpy 数组?

标签 python numpy

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

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

使用 Python 列表时,我可以使用 newline='\n' 正确处理此文件,如:iterating through files with carriage returns 中所述。

#!/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 中测试。

最佳答案

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

>
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)

关于python - 如何从包含杂散回车符和换行符的文本文件加载 numpy 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55887653/

相关文章:

python-3.x - 我想从 Python 中的点云生成网格

arrays - 删除给定数组中所有元素为 "True"的所有子数组

python - 在pyqt5中控制QThread?

python - 如何配置 sublimerope 自动完成 python 代码?

python - 尝试将字节转换为位时 Numpy unpackbits 类型错误

python - Colorbar offsetText(科学基础乘数)从colorbar的顶部移动到底部

python - 如何从包含列表的 Pandas 列中进行一次热编码?

python - 计算列表中子列表的特定索引中值的实例,但每个列表只计算一次

python - 在 Python 中用索引替换列表中的值

Python pandas modin - 找不到模块