如何在Python中检查EOF?

时间:2010-01-03 03:43:14

标签: python eof

如何在Python中检查EOF?我在代码中发现了一个错误,其中分隔符后的最后一个文本块未添加到返回列表中。或者也许有更好的方式来表达这个功能?

这是我的代码:

def get_text_blocks(filename):
    text_blocks = []
    text_block = StringIO.StringIO()
    with open(filename, 'r') as f:
        for line in f:
            text_block.write(line)
            print line
            if line.startswith('-- -'):
                text_blocks.append(text_block.getvalue())
                text_block.close()
                text_block = StringIO.StringIO()
    return text_blocks

5 个答案:

答案 0 :(得分:3)

您可能会发现使用itertools.groupby更容易解决此问题。

def get_text_blocks(filename):
    import itertools
    with open(filename,'r') as f:
        groups = itertools.groupby(f, lambda line:line.startswith('-- -'))
        return [''.join(lines) for is_separator, lines in groups if not is_separator]

另一种方法是使用regular expression来匹配分隔符:

def get_text_blocks(filename):
    import re
    seperator = re.compile('^-- -.*', re.M)
    with open(filename,'r') as f:
        return re.split(seperator, f.read())

答案 1 :(得分:1)

一旦for语句终止,文件结束条件就会成立 - 这似乎是修改此代码的最简单方法(如果您愿意,可以在最后提取text_block.getvalue()在附加之前检查它是否为空。)

答案 2 :(得分:1)

这是发射缓冲区的标准问题。

你没有发现EOF - 这是不必要的。你写了最后一个缓冲区。

def get_text_blocks(filename):
    text_blocks = []
    text_block = StringIO.StringIO()
    with open(filename, 'r') as f:
        for line in f:
            text_block.write(line)
            print line
            if line.startswith('-- -'):
                text_blocks.append(text_block.getvalue())
                text_block.close()
                text_block = StringIO.StringIO()
         ### At this moment, you are at EOF
         if len(text_block) > 0:
             text_blocks.append( text_block.getvalue() )
         ### Now your final block (if any) is appended.
    return text_blocks

答案 3 :(得分:-1)

为什么你需要StringIO?

def get_text_blocks(filename):
    text_blocks = [""]
    with open(filename, 'r') as f:
        for line in f:
            if line.startswith('-- -'):
                text_blocks.append(line)
            else: text_blocks[-1] += line          
    return text_blocks
编辑:修正了这个功能,其他建议可能会更好,只是想编写一个与原版相似的功能。

编辑:假设文件以“ - - ”开头,通过在列表中添加空字符串可以“修复”IndexError,或者你可以使用这个:

def get_text_blocks(filename):
    text_blocks = []
    with open(filename, 'r') as f:
        for line in f:
            if line.startswith('-- -'):
                text_blocks.append(line)
            else:
                if len(text_blocks) != 0:
                    text_blocks[-1] += line          
    return text_blocks

但是这两个版本对我来说有点难看,reg-ex版本更清晰。

答案 4 :(得分:-2)

这是查看您是否有空文件的快速方法:

if f.read(1) == '': 
 print "EOF"
 f.close()