Frage

Wie kann ich für EOF in Python? Ich fand einen Fehler in meinem Code, in dem der letzten Block von Text nach dem Trennzeichen nicht auf die Rückgabeliste hinzugefügt wird. Vielleicht gibt es einen besseren Weg, um diese Funktion auszudrücken?

Hier ist mein Code:

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
War es hilfreich?

Lösung

Sie finden es einfacher, dies zu lösen, indem 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]

Eine weitere Alternative ist die Verwendung eines regulärer Ausdruck die Separatoren entsprechen:

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

Andere Tipps

Die End-of-Datei enthält Bedingung, sobald die for Anweisung beendet - das ist die einfachste Art und Weise zu minorly fix diesem Code scheint (Sie text_block.getvalue() am Ende extrahieren können, wenn Sie überprüfen möchten, ist es nicht leer, bevor es anhängen) .

Dies ist das Standardproblem mit Puffern zu emittieren.

Sie erkennen nicht EOF - das unnötig ist. Sie schreiben den letzten Puffer.

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

Warum brauchen Sie StringIO hier?

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:. Fest die Funktion, andere Vorschläge könnte besser sein, wollte nur eine Funktion ähnlich dem Original schreiben

EDIT: die Datei beginnt mit angenommener „- -“, durch leere Zeichenfolge in der Liste hinzufügen, können Sie „fix“ die Indexerror oder könnten Sie verwenden diese ein:

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

Aber beide Versionen sehen ein bisschen hässlich zu mir, die reg-ex-Version ist viel sauberer.

Dies ist eine schnelle Art und Weise zu sehen, wenn Sie eine leere Datei haben:

if f.read(1) == '': 
 print "EOF"
 f.close()
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top