【问题标题】:Should I use `readinto` method of python file or not?我应该使用python文件的`readinto`方法吗?
【发布时间】: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 之前,我已经使用Cythonfread 来执行此操作。所以我很高兴知道一个纯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.concatenatenp.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


【解决方案1】:

如果你不确定file.readinto,你可以在python标准库中使用io.FileIO而不是内置函数openfile

这是文档字符串:

#io.FileIO.readinto?
Type:        method_descriptor
String form: <method 'readinto' of '_io.FileIO' objects>
Docstring:   readinto() -> Same as RawIOBase.readinto().

io.RawIOBase.readinto的文档可以在here找到。

类 io.RawIOBase

...

读入(b)

将最多 len(b) 个字节读入 bytearray b 并返回读取的字节数。如果对象处于非阻塞模式且没有可用字节,则返回 None。

它在 Python 2 和 3 中都可用。

【讨论】: