web-dev-qa-db-ja.com

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
8
ajushi

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]

もう1つの方法は、 正規表現 を使用して区切り文字を一致させることです。

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

これは、バッファの放出に関する標準的な問題です。

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
1
S.Lott

ファイルの終わり条件は、forステートメントが終了するとすぐに成立します。これは、このコードをマイナーに修正する最も簡単な方法のようです(必要に応じて、最後にtext_block.getvalue()を抽出できます。追加する前に、空でないことを確認してください)。

1
Alex Martelli