在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。
答案 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对齐以开始......)