Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 从标准输入读取时将numpy从文件移植到python3_Python 3.x_Python 2.7_Numpy - Fatal编程技术网

Python 3.x 从标准输入读取时将numpy从文件移植到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=" "))' [

我正在将一些代码移植到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=" "))'
[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
时,它会在某些遗留模式下运行