我最近遇到了readinto
对象的file
方法(在python 2.7中),它类似于C语言中的fread
。在某些情况下,它似乎很方便而且功能强大。我打算用它来将多个文件读入一个预先分配的numpy数组中,而无需复制数据。
例如
a = np.empty(N)
b = memoryview(a)
fp1.readinto(b[0:100])
fp2.readinto(b[100:200])
和
fp1.readinto(b[0:100])
fp1.seek(400, 1)
fp1.readinto(b[100:200])
在遇到
Cython
之前,我已经使用fread
和readinto
进行了此操作。因此,我很高兴知道一个纯Python解决方案。但是它的文档字符串说,
file.readinto?
Type: method_descriptor
String form: <method 'readinto' of 'file' objects>
Namespace: Python builtin
Docstring: readinto() -> Undocumented. Don't use this; it may go away.
不使用此吗?发生了什么事?
所以我很困惑,是否应该使用
readinto
?可能会导致任何不必要的问题?上面的代码在没有
readinto
的情况下是否还有其他实现方式,但也没有避免数据复制? (为避免复制,np.concatenate
或np.stack
并不是一个很好的选择。)任何建议都欢迎!谢谢你。
------- upate -------
看来我可以在标准库中使用
io.FileIO
而不是内置函数open
。看起来还不错,所以我已将其发布为答案。任何意见或其他解决方案仍然欢迎!
------- upate -------
如果您遇到相同的问题,则可能需要查看以下评论,网址为:
Andrea Corbellini和Padraic Cunningham。
最佳答案
如果不确定io.FileIO
,则可以在python标准库中使用open
而不是内置函数file
或file.readinto
。
这是文档字符串:
#io.FileIO.readinto?
Type: method_descriptor
String form: <method 'readinto' of '_io.FileIO' objects>
Docstring: readinto() -> Same as RawIOBase.readinto().
io.RawIOBase.readinto
的文档可以在here中找到。它在Python 2和3中都可用。