5 Stimmen

Python: Lesen Sie Whitespaces-getrennte Zeichenfolgen aus einer Datei ähnlich wie readline

In Python gibt f.readline() die nächste Zeile aus der Datei f zurück. Das heißt, es beginnt an der aktuellen Position von f, liest bis zum Zeilenumbruch, gibt alles dazwischen zurück und aktualisiert die Position von f.

Jetzt möchte ich genau dasselbe tun, aber für durch Leerzeichen getrennte Dateien (nicht nur Zeilenumbrüche). Betrachten Sie zum Beispiel eine Datei f mit dem Inhalt

token1 token2

token3                            token4

         token5

Also suche ich nach einer Funktion readtoken(), so dass nach dem Öffnen von f der erste Aufruf von f.readtoken() token1 zurückgibt, der zweite Aufruf token2 usw.

Für Effizienz und um Probleme mit sehr langen Zeilen oder sehr großen Dateien zu vermeiden, sollte kein Puffer verwendet werden.

Ich war mir fast sicher, dass dies "out of the box" mit der Standardbibliothek möglich sein sollte. Allerdings habe ich keine geeignete Funktion gefunden oder einen Weg, die Trennzeichen für readline() neu zu definieren.

9voto

Martijn Pieters Punkte 953257

Sie müssten eine Wrapper-Funktion erstellen; das ist einfach genug:

def read_by_tokens(fileobj):
    for line in fileobj:
        for token in line.split():
            yield token

Beachten Sie, dass .readline() nicht einfach einen Datei-Zeichen für Zeichen liest, bis ein Zeilenumbruch erreicht ist; die Datei wird in Blöcken (einem Puffer) gelesen, um die Leistung zu verbessern.

Die obige Methode liest die Datei nach Zeilen, gibt das Ergebnis aber nach Leerzeichen aufgeteilt zurück. Verwenden Sie es so:

with open('somefilename') as f:
    for token in read_by_tokens(f):
        print(token)

Weil read_by_tokens() ein Generator ist, müssen Sie entweder direkt über das Funktionsergebnis schleifen oder die next() Funktion verwenden, um die Token einzeln zu erhalten:

with open('somefilename') as f:
    tokenized = read_by_tokens(f)

    # erste beiden Tokens separat lesen
    first_token = next(tokenized)
    second_token = next(tokenized)

    for token in tokenized:
        # schleift über alle Tokens *außer den ersten beiden*
        print(token)

0 Stimmen

Beachten Sie, dass dies ein Generator (+1) ist, daher funktioniert es wie for line in f anstatt f.readline()

0 Stimmen

@HenryKeiter: Du solltest die Datei wirklich als Iterator verwenden anstatt .readline() Aufrufe zu benutzen, aber ja.

0 Stimmen

Natürlich. Ich wollte nur sicherstellen, dass es klar ist, da er speziell nach readline fragt. Deine Bearbeitungen haben meinen Kommentar jedoch überflüssig gemacht :)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X