Как загрузить пустые массивы из текстового файла, который содержит переносы строк в дополнение к переводу строки? - PullRequest
1 голос

У меня есть файл данных, разделенный строкой и новой строкой, который содержит случайные возвраты каретки, например:

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.

Ответы [ 2 ]

2 голосов
/ 28 апреля 2019

Вместо указания имени файла для 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)
0 голосов
/ 28 апреля 2019

Вы можете попробовать 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...