9

如何在 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
4

5 回答 5

2

您可能会发现使用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]

另一种选择是使用正则表达式来匹配分隔符:

def get_text_blocks(filename):
    import re
    seperator = re.compile('^-- -.*', re.M)
    with open(filename,'r') as f:
        return re.split(seperator, f.read())
于 2010-01-03T03:56:23.787 回答
1

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

于 2010-01-03T03:49:34.910 回答
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
于 2010-01-03T12:44:08.397 回答
-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 版本更干净。

于 2010-01-03T03:55:35.740 回答
-2

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

if f.read(1) == '': 
 print "EOF"
 f.close()
于 2012-04-10T17:28:34.690 回答