目前,我正在使用
def eofapproached(f):
pos = f.tell()
near = f.read(1) == ''
f.seek(pos)
return near
以检测以"r"模式(默认值(打开的文件是否为"在 EOF",因为下一个read
将产生 EOF 条件。
我可能会这样使用它:
f = open('filename.ext') # default 'r' mode
print(eofapproached(f))
仅供参考,我正在使用一些在EOF发生时停止的现有代码,我希望我的代码在发生这种情况之前执行一些操作。
我也对任何关于更好(例如,更简洁(函数名称的建议感兴趣。我想到了eofnear
,但这并不一定传达具体的含义。
目前,我使用 Python 3,但将来我可能会被迫使用 Python 2(遗留系统的一部分(。
您可以使用f.tell()
来查找您在文件中的当前位置。
问题是,您需要找出文件的大小。 niave(和高效(解决方案是os.path.getsize(filepath)
的,并将其与tell()
的结果进行比较,但这将返回以字节为单位的大小,这仅在以二进制模式('rb'
(读取时才相关,因为您的文件可能有多字节字符。
你最好的解决方案是寻找最后并返回以找出大小。
def char_count(f):
current = f.tell()
f.seek(0, 2)
end = f.tell()
f.seek(current)
return end
def chars_left(f, length=None):
if not length:
length = char_count(f)
return length - f.tell()
最好在开始时运行一次char_count
,然后将其传递给chars_left。 搜索效率不高,但您需要知道文件以字符为单位的长度,唯一的方法是读取它。
如果你正在逐行阅读,并且想知道在阅读最后一行之前,你还必须知道你的最后一行有多长,看看你是否在最后一行的开头。
如果您正在逐行阅读,并且只想知道下一行读取是否会导致 EOF,那么当您chars_left(f, total) == 0
时,您知道您在那里(没有更多的行可以阅读(
我制定了这段代码以避免使用tell
(也许使用tell
更简单(:
import os
class NearEOFException(Exception): pass
def tellMe_before_EOF(filePath, chunk_size):
fileSize = os.path.getsize(filePath)
chunks_num = (fileSize // chunk_size) # how many chunks can we read from file?
reads = 0 # how many chunks we read so far
f = open(filePath)
if chunks_num == 0:
raise NearEOFException("File is near EOF")
for i in range(chunks_num-1):
yield f.read(chunk_size)
else:
raise NearEOFException("File is near EOF")
if __name__ == "__main__":
g = tellMe_before_EOF("xyz", 3) # read in chunks of 3 chars
while True:
print(next(g), end='') # near EOF raise NearEOFException
该函数的命名存在争议。命名东西很无聊,我只是不擅长。
该函数的工作原理是这样的:获取文件的大小,看看我们可以读取大约多少次 N 大小的块并将其存储在chunks_num
中。这个简单的划分让我们接近EOF,问题是你认为EOF附近在哪里?例如,靠近最后一个字符或接近最后 n 个字符?如果重要的话,也许这是要记住的事情。
跟踪此代码以查看其工作原理。