Как я проверяю на EOF в Python? Я нашел ошибку в своем коде, где последний блок текста после разделителя не добавляется к списку возврата. Или возможно существует лучший способ выразить эту функцию?
Вот мой код:
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]
Другая альтернатива - использовать регулярное выражение для сравнения разделителей:
def get_text_blocks(filename):
import re
seperator = re.compile('^-- -.*', re.M)
with open(filename,'r') as f:
return re.split(seperator, f.read())
Условие конца файла удерживается, как только завершается оператор для
-- это кажется самым простым способом незначительного исправления этого кода (вы можете извлечь text_block.getvalue()
в конце, если хотите проверить, что он не пустой перед добавлением)
Это стандартная проблема с испусканием буферов.
Вы не определяете 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
Зачем здесь 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
EDIT: Исправлена функция, другие предложения могут быть лучше, просто хотелось написать функцию, похожую на оригинальную.
EDIT: Предполагается, что файл начинается с "-- -", добавив пустую строку в список, вы можете "исправить" ошибку 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 намного чище.
.