1370 Stimmen

Richtiger Weg, um eine Zeile in eine Datei zu schreiben?

Wie schreibe ich in modernem Python eine Zeile in eine Datei? Ich habe gehört, dass dies veraltet ist:

print >>f, "hallo"

Funktioniert "\n" auf allen Plattformen oder sollte ich "\r\n" auf Windows verwenden?

26voto

Keith Punkte 40296

In Python 3 ist es eine Funktion, aber in Python 2 können Sie dies am Anfang der Quelldatei hinzufügen:

from __future__ import print_function

Dann machen Sie

print("Hallo", file=f)

20voto

johnson Punkte 2776

Seit 3.5 können Sie auch die pathlib für diesen Zweck verwenden:

Path.write_text(data, encoding=None, errors=None)

Öffnen Sie die Datei im Textmodus, schreiben Sie die Daten hinein und schließen Sie die Datei:

import pathlib

pathlib.Path('textfile.txt').write_text('Inhalt')

18voto

Robin Keskisarkka Punkte 777

Wenn Sie viele Daten schreiben und Geschwindigkeit eine Rolle spielt, sollten Sie wahrscheinlich mit f.write(...) gehen. Ich habe einen schnellen Geschwindigkeitsvergleich gemacht und es war deutlich schneller als print(..., file=f), wenn eine große Anzahl von Schreibvorgängen durchgeführt wird.

import time    

start = start = time.time()
with open("test.txt", 'w') as f:
    for i in range(10000000):
        # print('This is a speed test', file=f)
        # f.write('This is a speed test\n')
end = time.time()
print(end - start)

Im Durchschnitt dauerte write 2,45 Sekunden auf meinem Rechner, während print etwa 4 Mal so lange dauerte (9,76 Sekunden). In den meisten realen Szenarien wird dies jedoch kein Problem darstellen.

Wenn Sie sich dafür entscheiden, print(..., file=f) zu verwenden, werden Sie wahrscheinlich feststellen, dass Sie gelegentlich das Zeilenumbruch unterdrücken oder durch etwas anderes ersetzen möchten. Dies kann durch Festlegen des optionalen end-Parameters erfolgen, z. B .;

with open("test", 'w') as f:
    print('Foo1,', file=f, end='')
    print('Foo2,', file=f, end='')
    print('Foo3', file=f)

Wie auch immer Sie sich entscheiden, würde ich vorschlagen, with zu verwenden, da der Code dadurch viel einfacher zu lesen ist.

Aktualisierung: Dieser Leistungsunterschied erklärt sich daraus, dass write stark gepuffert ist und zurückkehrt, bevor tatsächlich irgendwelche Schreibvorgänge auf die Festplatte erfolgen (siehe diese Antwort), während print (wahrscheinlich) eine Zeilenpufferung verwendet. Ein einfacher Test hierfür wäre die Überprüfung der Leistung für lange Schreibvorgänge, bei denen die Nachteile (in Bezug auf Geschwindigkeit) für Zeilenpufferung weniger stark ausgeprägt wären.

start = start = time.time()
long_line = 'This is a speed test' * 100
with open("test.txt", 'w') as f:
    for i in range(1000000):
        # print(long_line, file=f)
        # f.write(long_line + '\n')
end = time.time()

print(end - start, "s")

Der Leistungsunterschied wird nun deutlich geringer, mit einer durchschnittlichen Zeit von 2,20 Sekunden für write und 3,10 Sekunden für print. Wenn Sie eine Menge Zeichenketten verknüpfen müssen, um diese lange Linie zu erhalten, wird die Leistung leiden, daher sind Anwendungsfälle, in denen print effizienter wäre, etwas seltener.

8voto

Reza Tanzifi Punkte 532

Wenn Sie Line sagen, bedeutet das einige serialisierte Zeichen, die mit '\n'-Zeichen enden. Die Zeile sollte irgendwann das Letzte sein, also sollten wir am Ende jeder Zeile '\n' berücksichtigen. Hier ist die Lösung:

with open('YOURFILE.txt', 'a') as the_file:
    the_file.write("Hallo")

Im Anhänge-Modus bewegt sich der Cursor nach jedem Schreibvorgang in eine neue Zeile. Wenn Sie den Modus w verwenden möchten, sollten Sie am Ende der write()-Funktion \n-Zeichen hinzufügen:

the_file.write("Hallo\n")

6voto

Alfredo EP Punkte 51

Wenn Sie Elemente in einer Liste mit einem Format pro Zeile einfügen möchten, könnte ein Ausgangspunkt sein:

with open('somefile.txt', 'a') as the_file:
    for item in items:
        the_file.write(f"{item}\n")

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