查看在Python 3中读取了多少`file.read`

时间:2018-09-05 14:05:27

标签: python file

  

读取并返回最大字节数。如果省略该参数,则为None或   否,读取数据并返回直到达到EOF。一个空的   如果流已经在EOF处,则返回bytes对象。

     

如果参数为正,且基础原始流不为   交互式,可以发出多个原始读取来满足该字节   计数(除非先达到EOF)。但是对于交互式原始流,   最多将发布一份原始读物,,并且简短的结果并不意味着   即将到来的EOF。

     

如果基础原始流不存在,则会引发BlockingIOError   阻止模式,目前没有可用数据。

     

io.BufferedIOBase.read

如果读取操作返回的结果的长度可以小于给定或预期的数量;并且仍然不建议达到EOF,哪种可靠的分块方式最可靠?

interface PersonSummary 
{
      String getFirstname();
      String getLastname();
      AddressSummary getAddress();

      interface AddressSummary {
        String getCity();
      }
}

interface PersonRepository extends Repository<Person, UUID> {

  Collection<PersonSummary> findByLastname(String lastname);
}

最初,我认为出于某种原因,块大小越低,读取将完全执行的可能性就越高;但是我不完全知道这是否正确-因此它测试了上述功能的可靠性。 这也非常无效,因为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 接近1,函数调用的数量接近chk_size,这对于真正的大文件来说并不是最佳选择。

从本质上讲,无需使用CFFI导入file_sizefopenfread-存在的内置函数或库可以可靠地读取内容,这也在我的标题范围内;该函数返回准确的读取量,或者将读取缓冲区按引用放置在列表中,或者作为fclose的元组。

1 个答案:

答案 0 :(得分:1)

在您引用的文档中注意:

  可能会发出

多次原始读取以满足字节数

这意味着此循环无用。原始读取是操作系统使用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,其中包含您必须管理的完整控件和原始错误检查。