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