什么是 Python 检测下一次读取将在 Python 3(和 Python 2)中产生 EOF 的 Pythonic



目前,我正在使用

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 个字符?如果重要的话,也许这是要记住的事情。

跟踪此代码以查看其工作原理。

最新更新