Как проверить на EOF в Python?

Как я проверяю на 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
8
задан ajushi 3 January 2010 в 03:54
поделиться

4 ответа

Возможно, вам будет проще решить эту проблему, используя 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())
2
ответ дан 6 December 2019 в 02:25
поделиться

Условие конца файла удерживается, как только завершается оператор для -- это кажется самым простым способом незначительного исправления этого кода (вы можете извлечь text_block.getvalue() в конце, если хотите проверить, что он не пустой перед добавлением)

.
1
ответ дан 6 December 2019 в 02:25
поделиться

Это стандартная проблема с испусканием буферов.

Вы не определяете 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
ответ дан 6 December 2019 в 02:25
поделиться

Зачем здесь 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 намного чище.

.
-1
ответ дан 6 December 2019 в 02:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: