fp = open("a.txt")
#do many things with fp
c = fp.read()
if c is None:
print 'fp is at the eof'
除上述方法外,还有其他方法可以找出fp是否已达到eof?
Answers:
fp.read()
读取文件的末尾,因此,成功完成文件后,您知道文件位于EOF处;无需检查。如果无法达到EOF,则会引发异常。
当分块读取文件而不是用读取文件时read()
,您知道当read
返回的字节数少于您请求的字节数时,您遇到了EOF 。在这种情况下,以下read
调用将返回空字符串(不是None
)。以下循环读取大块文件;read
最多只会调用一次。
assert n > 0
while True:
chunk = fp.read(n)
if chunk == '':
break
process(chunk)
或者,更短:
for chunk in iter(lambda: fp.read(n), ''):
process(chunk)
eof
达到?
fp.read(n)
,您会知道当EOF返回的n
字符数少于字符时,您已击中EOF 。
for line in file: ...
for循环来为您处理。
if chunk == '':
仅适用于文字串流,if chunk == b'':
二进制流才需要,请注意额外的b。
“其他”设计经常被忽略。请参阅:Python Docs“循环中的控制流”:
例
with open('foobar.file', 'rb') as f:
for line in f:
foo()
else:
# No more lines to be read from file
bar()
else:
。不写它,只是bar()
工作原理相同。else
仅当您使用时才有所不同break
。
我认为从文件读取是确定文件是否包含更多数据的最可靠方法。可能是管道,也可能是另一个进程将数据追加到文件等。
如果您知道这不是问题,则可以使用以下方法:
f.tell() == os.fstat(f.fileno()).st_size
''
fh.seek(0, 2); file_size = fh.tell(); fh.seek(0)
,然后fh.tell() == file_size
再。以您的方式进行操作有好处吗?注意:我当然建议将大小缓存到一个变量中,而不是os.fstat
在每个循环中都调用。
f.tell()
以字符os.fstat(f.fileno()).st_size
为单位提供文件位置,以字节为单位提供文件长度。不过,@ BrunoBronosky的方法将起作用。
由于python在EOF上返回空字符串,而不是“ EOF”本身,因此您只需检查代码即可,写在这里
f1 = open("sample.txt")
while True:
line = f1.readline()
print line
if ("" == line):
print "file finished"
break;
readline
return "\n"
。仅当文件实际位于EOF时,它才返回空字符串。
在执行二进制I / O时,以下方法很有用:
while f.read(1):
f.seek(-1,1)
# whatever
优点是有时您正在处理二进制流,并且事先不知道需要读取多少内容。
f.read(1)
将在EOF返回空字符串。
f.read(1)
且文件不在at时EOF
,您只读取了一个字节,因此f.seek(-1,1)
告诉文件将文件后移一个字节。
bool('\0')
。
f=open(file_name)
for line in f:
print line
f = open(...)
而不是时with open(...) as f
,您还应该确保f.close()
在完成操作后致电,否则可能会有意想不到的副作用
我真的不明白为什么python仍然没有这样的功能。我也不同意使用以下内容
f.tell() == os.fstat(f.fileno()).st_size
主要原因是f.tell()
在某些特殊条件下不太可能起作用。
该方法对我有效,如下所示。如果您有类似以下的伪代码
while not EOF(f):
line = f.readline()
" do something with line"
您可以将其替换为:
lines = iter(f.readlines())
while True:
try:
line = next(lines)
" do something with line"
except StopIteration:
break
这种方法很简单,您不需要更改大多数代码。
f = open(filename,'r')
f.seek(-1,2) # go to the file end.
eof = f.tell() # get the end of file location
f.seek(0,0) # go back to file beginning
while(f.tell() != eof):
<body>
您可以使用文件方法 seek()和tell()来确定文件末尾的位置。找到位置后,返回到文件开头
Python没有内置的eof检测功能,但是该功能可以通过两种方式使用:如果没有更多的字节要读取,f.read(1)
则返回b''
。这适用于文本以及二进制文件。第二种方法是用于f.tell()
查看当前搜索位置是否在末尾。如果您希望EOF测试不更改当前文件位置,则需要一些额外的代码。
以下是两个实现。
使用tell()方法
import os
def is_eof(f):
cur = f.tell() # save current position
f.seek(0, os.SEEK_END)
end = f.tell() # find the size of file
f.seek(cur, os.SEEK_SET)
return cur == end
使用read()方法
def is_eof(f):
s = f.read(1)
if s != b'': # restore position
f.seek(-1, os.SEEK_CUR)
return s == b''
如何使用
while not is_eof(my_file):
val = my_file.read(10)
f = open("a.txt", "r")
while (c := f.read(n)):
process(c)
f.close()
海象运算符:https : //docs.python.org/3/whatsnew/3.8.html#assignment-expressions
文件对象的方法:https : //docs.python.org/3/tutorial/inputoutput.html#methods-of-file-objects
您可以tell()
在EOF
调用方法后使用方法readlines()
,如下所示:
fp=open('file_name','r')
lines=fp.readlines()
eof=fp.tell() # here we store the pointer
# indicating the end of the file in eof
fp.seek(0) # we bring the cursor at the begining of the file
if eof != fp.tell(): # we check if the cursor
do_something() # reaches the end of the file
获取文件的EOF位置:
def get_eof_position(file_handle):
original_position = file_handle.tell()
eof_position = file_handle.seek(0, 2)
file_handle.seek(original_position)
return eof_position
并将其与当前位置进行比较:get_eof_position == file_handle.tell()
。
分批读取文件BATCH_SIZE
(最后一批可以更短):
BATCH_SIZE = 1000 # lines
with open('/path/to/a/file') as fin:
eof = False
while eof is False:
# We use an iterator to check later if it was fully realized. This
# is a way to know if we reached the EOF.
# NOTE: file.tell() can't be used with iterators.
batch_range = iter(range(BATCH_SIZE))
acc = [line for (_, line) in zip(batch_range, fin)]
# DO SOMETHING WITH "acc"
# If we still have something to iterate, we have read the whole
# file.
if any(batch_range):
eof = True
我使用此功能:
# Returns True if End-Of-File is reached
def EOF(f):
current_pos = f.tell()
file_size = os.fstat(f.fileno()).st_size
return current_pos >= file_size
with
语句-它可以为您很好地处理关闭和异常,并且读起来也不错。