Lesen von Dateien mit Python

Einleitung

Um mit gespeicherten Daten zu arbeiten, wird der Umgang mit Dateien zum Kernwissen eines jeden professionellen Python-Programmierers. Bereits in der frühesten Version sind sowohl das Lesen als auch das Schreiben von Daten in Dateien integrierte Python-Funktionen. Im Vergleich zu anderen Programmiersprachen wie C oder Java ist es ziemlich einfach und erfordert nur wenige Codezeilen. Darüber hinaus muss kein zusätzliches Modul geladen werden, um dies ordnungsgemäß zu tun.

In diesem Artikel erklären wir anhand von Beispielen, wie man Dateien mit Python liest. Einige Beispiele umfassen das zeilenweise Lesen einer Datei als Chunk (eine definierte Anzahl von Zeilen gleichzeitig) und das Lesen einer Datei in einem Durchgang. Außerdem zeigen wir Ihnen eine Möglichkeit, nur eine bestimmte Zeile aus der Datei zu lesen, ohne die gesamte Datei zu durchsuchen.

Grundlagen von Dateien in Python

Die üblichen Methoden zum Arbeiten mit Dateien sind open() um eine Datei zu öffnen, seek() um die aktuelle Position der Datei auf den angegebenen Offset zu setzen, und close() um das Dateiobjekt zu schließen, wenn Sie es nicht mehr verwenden. Das eingebaute open() Die Funktion gibt ein Datei-Handle zurück, das ein Dateiobjekt darstellt, das für den Zugriff auf die Datei zum Lesen, Schreiben oder Anhängen verwendet werden soll.

Beim Öffnen einer Datei zum Lesen muss Python genau wissen, wie die Datei mit dem System geöffnet werden soll. Es stehen zwei Zugriffsmodi zur Verfügung – Lesen und Lesen im Binärmodus. Die jeweils verwendeten Flags sind 'r' und 'rb', und müssen beim Öffnen einer Datei mit dem eingebauten angegeben werden open() Funktion. Der erste Modus umfasst die Interpretation von Sonderzeichen wie „CR“ (Wagenrücklauf) und „LF“ (Zeilenvorschub), um Zeilenumbrüche darzustellen, während der Binärmodus es Ihnen ermöglicht, die Daten im Rohmodus zu lesen – wo die Daten so gespeichert werden, wie sie sind ohne weitere Deutung.

Sobald Sie eine Datei geöffnet haben, wird die open() Funktion gibt Ihnen ein Dateiobjekt zurück. Diese Dateiobjekte haben Methoden wie read(), readline(), write(), tell() und seek(). Während einige Dateiobjekte (oder dateiähnliche Objekte) mehr Methoden als die hier aufgelisteten haben, sind dies die gebräuchlichsten. Nicht alle Dateiobjekte müssen alle Dateimethoden implementieren.

Lesen einer Datei Zeile für Zeile

Das erste Beispiel ist von den beiden Programmiersprachen C und C++ inspiriert. Es ist wahrscheinlich der intuitivste Ansatz – öffnen Sie die Datei mit der open() Funktion, Lesen Sie die Datei Zeile für Zeile Verwendung der readline() Methode, und geben Sie die Zeile sofort nach dem Lesen aus.

Im Einsatz ist hier ein while Schleife, die kontinuierlich aus der Datei liest, solange die readline() Methode gibt weiterhin Daten zurück. Falls das Dateiende (EOF) erreicht ist, wird die while Die Schleife stoppt und das Dateiobjekt wird geschlossen, wodurch die Ressourcen für andere Programme freigegeben werden:


filename = "test.txt"

filehandle = open(filename, 'r')
while True:
    
    line = filehandle.readline()
    if not line:
        break
    print(line)


filehandle.close()

Wie Sie vielleicht bemerkt haben, haben wir die Datei in diesem Beispiel explizit geöffnet und geschlossen. Obwohl der Python-Interpreter die geöffneten Dateien am Ende der Ausführung des Python-Programms automatisch schließt, schließt er die Datei explizit über close() ist ein guter Programmierstil und sollte nicht vergessen werden.

Als Verbesserung ist die bequemes Iteratorprotokoll wurde in Python 2.3 eingeführt. Damit vereinfachen Sie die readline Schleife:


filename = "test.txt"
for line in open(filename, 'r'):
    print(line)

Im Einsatz ist hier ein for Schleife in Kombination mit der in Iterator. Die aktuelle Zeile wird mit Hilfe des identifiziert in Iterator, aus der Datei gelesen und sein Inhalt ausgegeben stdout. Python übernimmt das Öffnen und Schließen der Datei für Sie, wenn sie außerhalb des Gültigkeitsbereichs liegt. Obwohl dies ineffizient ist, müssen Sie sich nicht mehr mit Dateihandles befassen.

Leider ist der obige Code weniger explizit und verlässt sich auf die interne Garbage Collection von Python, um das Schließen der Datei zu handhaben.

Eingeführt in Python 2.5, die with Der Befehl kapselt den gesamten Prozess noch mehr und verarbeitet auch das Öffnen und Schließen von Dateien nur einmal im gesamten Codeblock:


filename = "test.txt"
with open(filename, 'r') as filehandle:
    for line in filehandle:
        print(line)

Die Kombination der with Aussage und die open() Befehl öffnet die Datei nur einmal. Bei Erfolg die for Schleife wird ausgeführt und der Inhalt der Zeile ausgegeben stdout.

Darüber hinaus ist die Nutzung der with Aussage hat eine Nebenwirkung. Intern erstellt der Python-Interpreter eine try-finally-block, um das Lesen aus der Datei zu kapseln. Das folgende Beispiel zeigt, was im Wesentlichen intern in Python mit der passiert with Codeblöcke:

try:
    filehandle = open(filename, 'r')
    
finally:
    filehandle.close()

Lesen einer Datei als Zeilenblöcke

Bisher haben wir eine Datei zeilenweise abgearbeitet. Dies ist bei großen Dateien ziemlich langsam und kann verbessert werden, indem mehrere Zeilen gleichzeitig gelesen werden. Um das zu erreichen, die islice() Methode aus dem itertools Modul kommt ins Spiel. Außerdem fungiert es als Iterator und gibt einen Datenblock zurück, der besteht aus n Linien. Am Ende der Datei kann das Ergebnis kürzer sein, und schließlich gibt der Aufruf eine leere Liste zurück:

from itertools import islice

filename = "test.txt"

number_of_lines = 5

with open(filename, 'r') as input_file:
    lines_cache = islice(input_file, number_of_lines)
   
    for current_line in lines_cache:
        print (current_line)

Lesen einer bestimmten Zeile aus einer Datei

Mit den oben gezeigten Methoden können wir auch andere nützliche Aktionen ausführen, z. B. das Lesen einer bestimmten Zeile aus einer Datei. Dazu verwenden wir einen Zähler und drucken die entsprechende Zeile, wenn wir beim Durchlaufen der Datei darauf stoßen:


filename = "test.txt"

line_number = 3
print (f"line {line_number} of {filename} is: ")

with open(filename, 'r') as filehandle:
current_line = 1
    for line in filehandle:
        if current_line == line_number:
            print(line)
            break
        current_line += 1

Dies sollte einfach zu verstehen sein, ist aber etwas länger als die vorherigen Beispiele. Es kann mit gekürzt werden Linecache Modul.

Das folgende Beispiel zeigt, wie der Code mithilfe von vereinfacht wird getline() Methode. Wenn die angeforderte Zeilennummer außerhalb des Bereichs gültiger Zeilen in der Datei liegt, wird die getline() Methode gibt stattdessen einen leeren String zurück:


import linecache

filename = "test.txt"

line_number = 3

line = linecache.getline(filename, line_number)
print (f"line {line_number} of {filename}:")
print (line)

Lesen der gesamten Datei auf einmal

Zu guter Letzt schauen wir uns einen ganz anderen Fall als das vorherige Beispiel an – das Lesen einer ganzen Datei auf einmal.

Denken Sie daran, dass Sie in den meisten Fällen genügend Speicher haben sollten, um die gesamte Datei zu lesen, da Zeichen nicht zu viel Platz beanspruchen, aber seien Sie müde von großen Dateien. Das folgende Beispiel verwendet eine Kombination der with Aussage, und die read() Methode. In diesem Fall verwenden wir read() So laden Sie den Dateiinhalt als Datenstrom:

Sehen Sie sich unseren praxisnahen, praktischen Leitfaden zum Erlernen von Git an, mit Best Practices, branchenweit akzeptierten Standards und einem mitgelieferten Spickzettel. Hören Sie auf, Git-Befehle zu googeln und tatsächlich in Verbindung, um es!


filename = "test.txt"

with open(filename, 'r') as filehandle:
    filecontent = filehandle.read()
    print (filecontent)

Python bietet auch die readlines() Methode, die der ähnlich ist readline() Methode aus dem ersten Beispiel. Im Kontrast zu read(), wird der Dateiinhalt in einer Liste gespeichert, wobei jede Zeile des Inhalts ein Element ist:


filename = "test.txt"

with open(filename, 'r') as filehandle:
    filecontent = filehandle.readlines()
    for line in filecontent:
        print (line)

Während readlines() liest Inhalte aus der Datei, bis sie EOF erreicht, denken Sie daran, dass Sie die Menge der gelesenen Inhalte auch begrenzen können, indem Sie die angeben sizehint Parameter, der die Anzahl der zu lesenden Bytes ist.

Zusammenfassung

Wie üblich gibt es mehr als eine Möglichkeit, den Inhalt einer Datei zu lesen. Von der Geschwindigkeit her liegen alle mehr oder weniger in derselben Kategorie. Welche Lösung für Sie am besten geeignet ist, hängt von Ihrem spezifischen Anwendungsfall ab. Wir denken, dass es sehr hilfreich ist, zu sehen, was möglich ist, und dann die Lösung zu wählen, die am besten passt.

Obwohl Python den Prozess des Lesens von Dateien erheblich vereinfacht, kann es manchmal dennoch schwierig werden, in diesem Fall würde ich Ihnen empfehlen, einen Blick auf die zu werfen offizielle Python-Dokumentation for more info

Zeitstempel:

Mehr von Stapelmissbrauch