【发布时间】:2016-04-18 13:28:14
【问题描述】:
我最近遇到file 对象的readinto 方法(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])
在遇到readinto 之前,我已经使用Cython 和fread 来执行此操作。所以我很高兴知道一个纯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 不是一个好的选择。)
欢迎提出任何建议!谢谢。
-------更新-------
看来我可以在标准库中使用io.FileIO,而不是内置函数open。看起来不错,所以我将其发布为答案。
仍然欢迎任何评论或其他解决方案!
-------更新-------
如果你遇到同样的问题,你可能想看看下面的 cmets
Andrea Corbellini 和 Padraic Cunningham。
【问题讨论】:
-
@AndreaCorbellini 只需在 IPython 中输入
file.readinto?,这相当于标准 python shell 中的help(file.readinto)。正如您所说,我已经检查了其他file方法,但只有readinto显示此消息。 -
@SyrtisMajor:嗯,实际上它一直被接受,即使在内置的
file对象中也是如此。该消息来自一个没有我们今天所拥有的bytearrays 的 Python。 -
@SyrtisMajor:在 Python 3 中,
open()默认以文本模式打开文件。readinto()是二进制文件的一个特性。试试open(..., 'rb')
标签: python file numpy python-2.x fromfile