Wie man große Textdateien in Python liest
Das Python-Dateiobjekt bietet verschiedene Möglichkeiten, eine Textdatei zu lesen. Die gängigste Methode ist die Verwendung der readlines()-Methode, die eine Liste aller Zeilen in der Datei zurückgibt. Sie ist jedoch nicht geeignet, um eine große Textdatei zu lesen, da der gesamte Inhalt der Datei in den Speicher geladen wird.
Das Lesen großer Textdateien in Python
Wir können das Dateiobjekt als Iterator verwenden. Der Iterator gibt jede Zeile nacheinander zurück, die verarbeitet werden kann. Dies liest nicht die gesamte Datei in den Speicher und eignet sich zum Lesen großer Dateien in Python. Hier ist der Codeausschnitt zum Lesen einer großen Datei in Python, indem es als Iterator behandelt wird.
import resource
import os
file_name = "/Users/pankaj/abcdef.txt"
print(f'File Size is {os.stat(file_name).st_size / (1024 * 1024)} MB')
txt_file = open(file_name)
count = 0
for line in txt_file:
# we can process file line by line here, for simplicity I am taking count of lines
count += 1
txt_file.close()
print(f'Number of Lines in the file is {count}')
print('Peak Memory Usage =', resource.getrusage(resource.RUSAGE_SELF).ru_maxrss)
print('User Mode Time =', resource.getrusage(resource.RUSAGE_SELF).ru_utime)
print('System Mode Time =', resource.getrusage(resource.RUSAGE_SELF).ru_stime)
Wenn wir dieses Programm ausführen, ist die erzeugte Ausgabe:
File Size is 257.4920654296875 MB
Number of Lines in the file is 60000000
Peak Memory Usage = 5840896
User Mode Time = 11.46692
System Mode Time = 0.09655899999999999
- Ich benutze das os-Modul, um die Größe der Datei auszugeben.
- Das Ressourcenmodul wird verwendet, um die Speichernutzung und die CPU-Zeitnutzung des Programms zu überprüfen.
Wir können auch mit der Anweisung die Datei öffnen. In diesem Fall müssen wir das Dateiobjekt nicht ausdrücklich schließen.
with open(file_name) as txt_file:
for line in txt_file:
# process the line
pass
Was ist, wenn die große Datei keine Zeilen hat?
Der obenstehende Code funktioniert hervorragend, wenn der Inhalt der großen Datei in viele Zeilen unterteilt ist. Wenn sich jedoch eine große Menge an Daten in einer einzigen Zeile befindet, wird viel Speicher verwendet. In diesem Fall können wir den Dateinhalt in einen Puffer lesen und verarbeiten.
with open(file_name) as f:
while True:
data = f.read(1024)
if not data:
break
print(data)
Der obige Code liest die Dateidaten in einen Puffer von 1024 Bytes ein. Dann geben wir sie in der Konsole aus. Wenn die gesamte Datei gelesen wurde, wird die Daten leer und die Break-Anweisung beendet die While-Schleife. Diese Methode ist auch nützlich zum Lesen einer Binärdatei wie Bilder, PDFs, Word-Dokumente usw. Hier ist ein einfaches Code-Snippet, um eine Kopie der Datei zu erstellen.
with open(destination_file_name, 'w') as out_file:
with open(source_file_name) as in_file:
for line in in_file:
out_file.write(line)
Referenz: StackOverflow Frage

