我最近遇到了readinto
对象的file
方法(在Python 2.7中),它类似于C中的fread
。在某些情况下似乎方便而强大。我打算用它将几个文件读入一个预分配的numpy数组,不复制数据。
e.g。
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。
答案 0 :(得分:3)
如果您对io.FileIO
不确定,可以在python标准库中使用open
而不是内置函数file
或file.readinto
。
这是docstring:
#io.FileIO.readinto?
Type: method_descriptor
String form: <method 'readinto' of '_io.FileIO' objects>
Docstring: readinto() -> Same as RawIOBase.readinto().
可以找到io.RawIOBase.readinto
的文档here。
class io.RawIOBase
...
readinto(b)中
将len(b)字节读入bytearray b并返回读取的字节数。如果对象处于非阻塞模式且没有可用字节,则返回None。
它可以在Python 2和3中使用。