看看 Python 3 中读取了多少"file.read"



读取并返回最大大小字节。如果省略参数,则为"无"或 负数,读取并返回数据,直到达到 EOF。一个空的 如果流已处于 EOF,则返回字节对象。

如果参数为正数,而基础原始流不是 交互式,可以发出多个原始读取以满足字节 计数(除非首先达到 EOF(。但对于交互式原始流, 最多会发出一次原始读取,短结果并不意味着 EOF迫在眉睫。

如果基础原始流处于非 阻塞模式,目前没有可用数据。

哎呀。BufferedIOBase.read

如果读取操作返回的结果的长度可以小于给定或预期的数量;并且仍然没有表明已经达到EOF,那么哪种可靠的分块方式最可靠?

import os
import io
def reliable_read(file_obj, amount=None, chk_size=2):
file_size = os.fstat(file_obj.file_no()).st_size
data = b"" if isinstance(file_obj, io.BufferedReader) else ""
amount_read = 0
if amount is None:
amount = file_size
while amount_read < amount:
data += file_obj.read(chk_size)
return data

最初我认为,出于某种原因,块大小越小,读取完全执行的可能性就越高;但是我不完全知道这是否属实 - 因此它测试了上述函数的可靠性。 它的效率也很低,当chk_size接近 1 时,函数调用的数量接近file_size这对于真正的大文件来说不是最佳的。

本质上,不使用 CFFI 导入fopenfreadfclose- 存在什么内置函数或库,它允许可靠的读取,也在我的标题的本质中; 返回确切读取量的函数,要么通过引用将读取缓冲区放入列表中,要么作为(data, n_read)元组。

您引用的文档中的注释:

可以发出多个原始读取以满足字节计数

这意味着这个循环是无用的。原始读取是操作系统使用read()执行的读取,它可以返回少于某些输入流的请求。

while amount_read < amount:
data += file_obj.read(chk_size)

(加上循环没有更新amount_read所以我怀疑它有一个错误(

由于您使用的是python文件接口(不是os.read(,因此python将在内部执行此操作,如果完成操作所需的一个或多个内部原始读取失败,则在此过程中可能会出现错误。

你不控制内部read,所以你只需要做:

data = file_obj.read(amount)

如果您不想使用 pyhton 界面,请选择您必须管理的具有完全控制和原始错误检查的os.read