在Python3(和Python2)中,检测下一次读取将产生EOF的Pythonic方法是什么

2024-09-30 01:23:42 发布

您现在位置:Python中文网/ 问答频道 /正文

目前,我正在使用

def eofapproached(f):
    pos  = f.tell()
    near = f.read(1) == ''
    f.seek(pos)
    return near

检测在“r”模式下打开的文件(默认值)是否为“at EOF”,即下一个read将产生EOF条件。你知道吗

我可以这样用:

f = open('filename.ext') # default 'r' mode

print(eofapproached(f))

仅供参考,我正在处理一些现有的代码,这些代码在EOF发生时停止,我希望我的代码在EOF发生之前执行一些操作。你知道吗

我还对更好(例如,更简洁)的函数名的任何建议感兴趣。我想到了eofnear,但这并不一定能传达出具体的含义。你知道吗

目前,我使用python3,但将来可能会被迫使用python2(遗留系统的一部分)。你知道吗


Tags: 文件代码posreadreturndef模式seek
2条回答

我制定了这段代码来避免使用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个字符?如果有关系的话,也许这是需要记住的。你知道吗

跟踪此代码以了解其工作原理。你知道吗

您可以使用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\u left。查找效率不高,但您需要知道文件的字符长度,唯一的方法是读取它。你知道吗

如果你在逐行阅读,并且想在阅读最后一行之前知道,你还必须知道你的最后一行有多长,才能知道你是否在最后一行的开头。
如果你逐行阅读,只想知道下一行的阅读是否会导致EOF,那么当chars_left(f, total) == 0你知道你在那里(没有更多的行可以阅读)

相关问题 更多 >

    热门问题