Ich bin es gewohnt print >>f, "hi there"
Es scheint jedoch, dass print >>
dass dies veraltet ist. Was ist der empfohlene Weg, um die obige Zeile auszuführen?
Update : In Bezug auf all diese Antworten mit "\n"
... ist dies universell oder Unix-spezifisch? IE, sollte ich unter "\r\n"
Windows tun ?
Antworten:
Dies sollte so einfach sein wie:
Aus der Dokumentation:
Einige nützliche Lektüre:
with
Aussageopen()
os
(besondersos.linesep
)quelle
with
ist eine sicherere Methode, um daran zu denken, eine Datei zu schließen.the_file.close()
?Sie sollten die
print()
Funktion verwenden, die seit Python 2.6+ verfügbar istFür Python 3 benötigen Sie das nicht
import
, da dieprint()
Funktion die Standardeinstellung ist.Die Alternative wäre zu verwenden:
Zitat aus der Python-Dokumentation zu Zeilenumbrüchen:
quelle
\n
" würde newline = "erfordern", sonst würden Sie\r\r\n
unter Windows erhalten. Es gibt überhaupt keinen Grund, sich mit os.linesep zu beschäftigen.\r\n
das enthält,\n
was in os.linesep übersetzt wird, was\r\n
das Endergebnis ist\r\r\n
.open('myfile','a')
stattdessenopen('myfile','w')
?Die Python-Dokumente empfehlen Folgendes :
So mache ich das normalerweise :)
Aussage von docs.python.org :
quelle
with
Innere einer Schleife verschachteln muss . Dadurch öffne und schließe ich die Datei ständig, während ich in meiner Schleife fortfahre. Vielleicht fehlt mir hier etwas, oder das ist in diesem speziellen Szenario wirklich ein Nachteil?In Bezug auf os.linesep:
Hier ist eine exakte unbearbeitete Python 2.7.1-Interpretersitzung unter Windows:
Unter Windows:
Wie erwartet führt os.linesep NICHT zum gleichen Ergebnis wie
'\n'
. Es gibt keine Möglichkeit, das gleiche Ergebnis zu erzielen.'hi there' + os.linesep
ist äquivalent zu'hi there\r\n'
, was NICHT äquivalent zu ist'hi there\n'
.So einfach ist das: use,
\n
das automatisch in os.linesep übersetzt wird. Und so einfach ist es seit der ersten Portierung von Python auf Windows.Es macht keinen Sinn, os.linesep auf Nicht-Windows-Systemen zu verwenden, und es führt unter Windows zu falschen Ergebnissen.
VERWENDEN SIE NICHT os.linesep!
quelle
os.linesep
in Windows im Textmodus verwenden, das Ergebnis\r\r\n
falsch ist. "Windows verwendet ..." ist bedeutungslos. Die Laufzeitbibliothek C (und somit Python) übersetzen ,\n
um\r\n
im Textmodus auf ausgegeben. Andere Software verhält sich möglicherweise anders. Es ist NICHT der Fall, dass alle unter Windows ausgeführte Software\n
beim Lesen im Textmodus einen einzelnen als Trennzeichen erkennt . Python tut es. Der Notepad-Texteditor von Microsoft funktioniert nicht.\r
...os.linesep
ist es hier "falsch" , explizit zu sagen . Es ist wieDepartment of Redundancy Department
. Ja, du kannst es schaffen. Nein, das willst du nicht.Ich glaube nicht, dass es einen "richtigen" Weg gibt.
Ich würde ... benutzen:
In Erinnerung an Tim Toady .
quelle
with
Gültigkeitsbereich verlassen wird.open(..., 'a')
oder sogar'at'
.In Python 3 ist es eine Funktion, aber in Python 2 können Sie diese am Anfang der Quelldatei hinzufügen:
Dann tust du es
quelle
Wenn Sie viele Daten schreiben und Geschwindigkeit ein Problem ist, sollten Sie sich wahrscheinlich dafür entscheiden
f.write(...)
. Ich habe einen schnellen Geschwindigkeitsvergleich durchgeführt und er war erheblich schneller alsprint(..., file=f)
bei einer großen Anzahl von Schreibvorgängen.Im Durchschnitt
write
in 2.45s auf meiner Maschine beendet, währendprint
etwa 4-mal so lange (9,76s) dauerte. In den meisten realen Szenarien ist dies jedoch kein Problem.Wenn Sie sich dafür entscheiden, werden
print(..., file=f)
Sie wahrscheinlich feststellen, dass Sie die neue Zeile von Zeit zu Zeit unterdrücken oder durch etwas anderes ersetzen möchten. Dies kann durch Einstellen des optionalenend
Parameters erfolgen, z.Welchen Weg Sie auch wählen, ich würde vorschlagen, ihn zu verwenden,
with
da er den Code viel einfacher zu lesen macht.Update : Dieser Leistungsunterschied erklärt sich aus der Tatsache, dass er
write
stark gepuffert ist und zurückkehrt, bevor tatsächlich Schreibvorgänge auf die Festplatte stattfinden (siehe diese Antwort ), währendprint
(wahrscheinlich) die Zeilenpufferung verwendet wird. Ein einfacher Test hierfür wäre, die Leistung auch für lange Schreibvorgänge zu überprüfen, bei denen die Nachteile (in Bezug auf die Geschwindigkeit) für die Zeilenpufferung weniger ausgeprägt wären.Der Leistungsunterschied wird jetzt mit einer durchschnittlichen Zeit von 2,20 s für
write
und 3,10 s für viel weniger ausgeprägtprint
. Wenn Sie eine Reihe von Zeichenfolgen verketten müssen, um diese lange Leitungsleistung zu erzielen, leidet dies unter Anwendungsfällen, bei denenprint
dies effizienter wäre.quelle
Seit 3.5 können Sie auch das
pathlib
für diesen Zweck verwenden:quelle
Wenn Sie Zeile sagten, bedeutet dies einige serialisierte Zeichen, die mit '\ n' Zeichen enden. Die Zeile sollte irgendwann die letzte sein, daher sollten wir am Ende jeder Zeile '\ n' berücksichtigen. Hier ist die Lösung:
Im Append-Modus bewegt sich der Cursor nach jedem Schreibvorgang in eine neue Zeile. Wenn Sie den
w
Modus verwenden möchten, sollten Sie\n
am Ende derwrite()
Funktion Zeichen hinzufügen :quelle
Man kann das
io
Modul auch wie folgt verwenden:quelle
So schreiben Sie Text in eine Datei in der Flasche:
quelle
Sie können es auch versuchen
filewriter
pip install filewriter
Schreibt in
my_file.txt
Nimmt eine iterable oder ein Objekt mit
__str__
Unterstützung.quelle
Wenn ich viel neue Zeilen schreiben muss, definiere ich ein Lambda, das eine
print
Funktion verwendet:Dieser Ansatz hat den Vorteil, dass alle mit der
print
Funktion verfügbaren Funktionen genutzt werden können.Update: Wie von Georgy im Kommentarbereich erwähnt, ist es möglich, diese Idee mit der
partial
Funktion weiter zu verbessern :Meiner Meinung nach ist dies ein funktionaler und weniger kryptischer Ansatz.
quelle
from functools import partial; fwl = partial(print, file=out)
.