fp = open("a.txt")
#do many things with fp
c = fp.read()
if c is None:
print 'fp is at the eof'
Run Code Online (Sandbox Code Playgroud)
除了上面的方法,任何其他方式来找出是否是fp已经在eof?
Fre*_*Foo 54
fp.read()读到文件的末尾,所以在它成功完成后你知道文件是在EOF; 没有必要检查.如果无法达到EOF,则会引发异常.
当以块而不是块的形式读取文件时read(),您知道当read返回小于您请求的字节数时,您已经点击了EOF .在这种情况下,以下read调用将返回空字符串(不是None).以下循环以块的形式读取文件; 它read最多会调用一次太多.
assert n > 0
while True:
chunk = fp.read(n)
if chunk == '':
break
process(chunk)
Run Code Online (Sandbox Code Playgroud)
或者,更短:
for chunk in iter(lambda: fp.read(n), ''):
process(chunk)
Run Code Online (Sandbox Code Playgroud)
Bla*_*son 50
"for-else"设计经常被忽视.请参阅:Python Docs"循环控制流程":
例
with open('foobar.file', 'rb') as f:
for line in f:
foo()
else:
# No more lines to be read from file
bar()
Run Code Online (Sandbox Code Playgroud)
NPE*_*NPE 30
我认为从文件中读取是确定它是否包含更多数据的最可靠方法.它可能是一个管道,或者另一个进程可能会将数据附加到文件等.
如果您知道这不是问题,您可以使用以下内容:
f.tell() == os.fstat(f.fileno()).st_size
Run Code Online (Sandbox Code Playgroud)
小智 12
f = open("a.txt", "r")
while (c := f.read(n)):
process(c)
f.close()
Run Code Online (Sandbox Code Playgroud)
海象运算符:https ://docs.python.org/3/whatsnew/3.8.html#赋值表达式
文件对象的方法:https://docs.python.org/3/tutorial/inputoutput.html#methods-of-file-objects
use*_*424 11
在执行二进制I/O时,以下方法很有用:
while f.read(1):
f.seek(-1,1)
# whatever
Run Code Online (Sandbox Code Playgroud)
优点是,有时您正在处理二进制流,并且事先并不知道您需要读多少.
您可以比较fp.tell()调用read方法之前和之后的返回值.如果它们返回相同的值,则fp为eof.
此外,我认为您的示例代码实际上不起作用.据read我所知None,该方法永远不会返回,但它确实在eof上返回一个空字符串.
小智 8
由于python在EOF上返回空字符串,而不是"EOF"本身,您可以在此处查看代码
f1 = open("sample.txt")
while True:
line = f1.readline()
print line
if ("" == line):
print "file finished"
break;
Run Code Online (Sandbox Code Playgroud)
小智 7
我真的不明白为什么python仍然没有这样的功能。我也不同意使用以下内容
f.tell() == os.fstat(f.fileno()).st_size
Run Code Online (Sandbox Code Playgroud)
主要原因是f.tell()不太可能在某些特殊条件下工作。
该方法对我有用,如下所示。如果你有一些像下面这样的伪代码
while not EOF(f):
line = f.readline()
" do something with line"
Run Code Online (Sandbox Code Playgroud)
您可以将其替换为:
lines = iter(f.readlines())
while True:
try:
line = next(lines)
" do something with line"
except StopIteration:
break
Run Code Online (Sandbox Code Playgroud)
这种方法很简单,您不需要更改大部分代码。