Python 3.x 从标准输入读取时将numpy从文件移植到python3
我正在将一些代码移植到Python3中,无意中发现了对Python 3.x 从标准输入读取时将numpy从文件移植到python3,python-3.x,python-2.7,numpy,Python 3.x,Python 2.7,Numpy,我正在将一些代码移植到Python3中,无意中发现了对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=" "))' [
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
$echo 12 3 | python-c'导入numpy,sys;打印(numpy.fromfile(sys.stdin,dtype=int,sep=”“)'
[1 2 3]
$echo 1 2 3 | python3-c’import numpy,sys;打印(numpy.fromfile(sys.stdin,dtype=int,sep=”“)'
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
操作错误:获取文件位置失败
当我查看/usr/lib/python2.7/dist packages/numpy/core/records.py
时,似乎即使在python2版本的numpy中,它也表示fromfile:
文件对象必须支持随机访问(即,它必须具有tell和seek方法)
因此,我猜上面提到的Python2的工作原理从来就没有被支持过。我想移植到Python3的代码仍然依赖于此功能
我尝试将sys.stdin
读入一个io.BytesIO
中,但这将在io中出错。不支持操作:fileno
我希望其他人也会偶然发现这个问题,我想请求一个简单的替换
numpy.fromfile()
,它甚至可以在Python3上读取stdin。当然,其他项目已经实施了解决方案?我找不到一个。您可以尝试从stdin
中读取字节,如下所示:
data = sys.stdin.buffer.read()
然后使用numpy.frombuffer
读取它。(还应提供数据类型)
如果正在读取文本数据,可以执行以下操作:
data = sys.stdin.read()
arr = numpy.fromstring(data, sep=" ")
当您不提供
sep
时,它会在某些传统模式下工作。您可以尝试从stdin
读取字节,如下所示:
data = sys.stdin.buffer.read()
然后使用numpy.frombuffer
读取它。(还应提供数据类型)
如果正在读取文本数据,可以执行以下操作:
data = sys.stdin.read()
arr = numpy.fromstring(data, sep=" ")
当您不提供sep
时,它会在某些遗留模式下运行