python中的EOF等效方法?

时间:2017-05-15 07:05:37

标签: python

在python中是否有任何等效的方法可以替代C中的 EOF

假设一个文件包含3行。我想迭代文件,直到文件结束。

>>> fp.seek(0)
>>> with open(file,'rb') as openfileobject:
               for chunk in iter(partial(openfileobject.read,1024),''):
                           openfileobject.read()

上面的代码是无限循环的。我知道下面的代码对我来说很有用。

>>> for line in fp:
          print(line)

但是,我愿意手动迭代文件指针。这就是为什么我在python中搜索等效的eof。

1 个答案:

答案 0 :(得分:1)

您的代码有几个问题。最直接的错误是您的标记值必须是bytes对象,而不是str,因为您以二进制模式打开文件。这就是它永远循环的原因。所以使用b''

with open(file,'rb') as openfileobject:
    for chunk in iter(partial(openfileobject.read,1024), b''):
        openfileobject.read()

您需要使用b'',因为双参数iter的工作方式是该值必须是您传入的函数返回的值。 当文件对象用完时,函数fileobject.read将返回b'',而Python本身处理EOF。因此,对于所有意图和目的,您应该只关心b''。如果fileobject在测试模式下open,则fileobject.read将返回''字符串对象而不是bytes对象。

但实际上,你只会用这种方式进行一次迭代,因为在第一次迭代中你调用openfileobject.read,它会一直读到EOF。 chunk实际上是您需要的< = 1024字节块!

所以你真正想要的是:

with open(file,'rb') as openfileobject:
    for chunk in iter(partial(openfileobject.read,1024), b''):
        do_something(chunck)

根据评论进行修改:

所以,我认为你想要do_something的是这样的:

with open(file,'rb') as openfileobject:
    for chunk in iter(partial(openfileobject.read,1024), b''):
        for line in chunk.splitlines() # this strips the new-lines
            print(line) # for example, print...

但请记住,当您在" chunks"中读取文件时你的线将被分段(除非线条与chunksize对齐以开始......)