портирование numpy из файла в python3 при чтении со стандартного ввода - PullRequest
0 голосов
/ 29 марта 2020

Я портирую некоторый код на Python 3 и наткнулся на вызов numpy.fromfile(src), который прекрасно работает, когда src является дескриптором реального файла, но не работает, когда src равен sys.stdin. Я свел проблему к следующим двум командам, которые позволят вам увидеть, как проблема существует только в Python 3, но не в Python 2:

$ echo 1 2 3 | python -c 'import numpy,sys; print(numpy.fromfile(sys.stdin, dtype=int, sep=" "))'
[1 2 3]
$ echo 1 2 3 | python3 -c 'import numpy,sys; print(numpy.fromfile(sys.stdin, dtype=int, sep=" "))'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
OSError: obtaining file position failed

Когда я смотрю на /usr/lib/python2.7/dist-packages/numpy/core/records.py, то кажется, что даже в Python2 версии numpy для fromfile говорится:

Файловый объект должен поддерживать произвольный доступ (т. е. он должен иметь методы поиска и поиска).

Так что, я думаю, тот факт, что вышеприведенное работает с Python2, никогда не предполагалось поддерживать. Тем не менее код, который я хочу перенести на Python3, полагался на эту функциональность.

Я попытался прочитать sys.stdin в io.BytesIO, но это приведет к ошибке io.UnsupportedOperation: fileno.

In Я надеялся, что другие также натолкнулись на эту проблему, я хотел попросить простую замену numpy.fromfile(), которая позволяет читать из стандартного ввода даже на Python3. Конечно, другие проекты уже должны были реализовать решение этой проблемы? Я не смог найти его.

1 Ответ

0 голосов
/ 29 марта 2020

Вы можете попробовать прочитать байты из stdin следующим образом:

data = sys.stdin.buffer.read()

И затем использовать numpy.frombuffer для чтения. (Вы также должны предоставить тип данных)

arr = np.frombuffer(data, dtype=np.float)

Если вы читаете текстовые данные, вы можете сделать это:

data = sys.stdin.read()
arr = numpy.fromstring(data, sep=" ")

Когда вы не предоставите sep, он действует в какой-то устаревший режим.

...