2016-11-10 5 views
0

Im folgenden Code bin ich im Begriff, eine temporäre Datei zu erstellen und dann den gesamten Inhalt einer TXT-Datei in dieser temporären Datei zu speichern. Dies ist nur ein Beispiel. Ich weiß, dass es keinen Sinn macht, eine Textdatei zu lesen und sie dann in die temporäre Datei zu schreiben. Aber ich möchte meine Frage demonstrieren.Python: Gibt es einen besseren Weg für read()?

Nun, wenn ich die read() -Methode verwenden, bedeutet dies, dass der gesamte Inhalt der Temp-Datei im RAM-Speicher gespeichert ist, richtig? Ich kann die Inhaltsgröße der temporären Datei nicht steuern. Also denke ich darüber nach, ob es eine bessere Möglichkeit gibt, den RAM-Speicher zu schützen. Ich möchte den RAM-Speicher nicht überschwemmen.

# Use the TemporaryFile context manager for easy clean-up 
with tempfile.TemporaryFile(delete=True) as tmp: 
    with open('filename.txt', 'r') as my_file: 
     for line in my_file: 
      tmp.write(line) 

    tmp.seek(0) 

    exec(tmp.read()) 
+1

Der Code entspricht nicht der Textbeschreibung. Was ist deine eigentliche Aufgabe? Wollen Sie eine Textdatei als Python - Code ausführen (nach exec (tmp.read()) 'in Ihrem Code) oder wollen Sie den Inhalt einer Textdatei Zeile für Zeile in eine andere kopieren (nach 'für Zeile in Datei: output_file.write (line)' in Ihrem Code). Was ist deine eigentliche Frage? – jfs

+0

@ J. F. Sebastian; Du hast recht. Ich möchte eine Textdatei als Python-Code ausführen. In diesem Fall wird ein Code in einer Textdatei gespeichert. Aber später werde ich die Textdatei auf einem Webserver speichern. Mein Programm greift auf die Textdatei zu, speichert sie in der temporären Datei und führt sie dann aus. – Sophus

+1

Warum machst du dir dann Gedanken über RAM? Führst du es auf einem Mikrocontroller? Wie viel RAM ist verfügbar? Sie haben keine Angst, willkürlichen Code aus dem Internet zu starten, aber Sie befürchten, dass es zu viel Code gibt? Was macht der Code? Ist es sinnvoll, sie Zeile für Zeile auszuführen (mit einem eindeutigen Namespace)? Wenn Sie Daten aus dem Netzwerk lesen; Sie können aufhören, wann immer Sie möchten, aus welchem ​​Grund auch immer. – jfs

Antwort

1

Die for line in my_file ruft die Datei .next die does not buffer the entire file in memory when reading Objekte:

Um die effizienteste Art und Weise von Schleifen über die Zeilen einer Datei (eine sehr häufige Operation) eine for-Schleife zu machen, der nächste() -Methode verwendet einen versteckt Read-Ahead-Puffer

Vom docs:

Zum Lesen von Zeilen aus einer Datei können Sie das Dateiobjekt durchlaufen. Diese ist Speicher effizient, schnell und führt zu einfachen Code

Für die tmp.read() Funktion, von der docs:

Wenn die Größe weggelassen oder negativ ist, wird der gesamte Inhalt der Datei wird sein gelesen und zurückgegeben; es ist Ihr Problem, wenn die Datei doppelt so groß ist als der Speicher Ihres Computers.

Also, wenn Sie für Zeile lesen, wie Sie tun, wenn Sie schreiben, oder read mit einem festen Betrag schrittweise d.htmp.read(100), werden Sie die gesamte Datei in den Speicher gelesen.

+0

Ich fürchte, Sie haben meine Frage nicht verstanden, weil mein Fokus auf der read() -Methode liegt, die in der exec() -Methode verschachtelt ist. Schauen Sie, nachdem die erstellte temporäre Datei gefüllt wurde, benutze ich die Methode exec(). In diesem Zusammenhang verwende ich die read() Methode. Und jetzt denke ich darüber nach, ob die read() -Methode die RAM-Speicher überflutet hat? – Sophus

+0

Sie können immer lesen (SomeFixedAmount), bis Sie die gesamte Datei gelesen haben, wenn Sie Zeile für Zeile nicht lesen möchten, obwohl Sie Zeile für Zeile erneut lesen sollten, wenn Sie lesen müssen? – TheoretiCAL

Verwandte Themen