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?
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?
Dies sollte so einfach sein wie:
with open('somefile.txt', 'a') as the_file:
the_file.write('Hello\n')
Aus der Dokumentation:
Verwenden Sie kein
os.linesep
als Zeilentrenner beim Schreiben von Dateien, die im Textmodus geöffnet sind (standardmäßig); verwenden Sie stattdessen auf allen Plattformen einfach'\n'
.
Einige nützliche Lektüre:
with
-Anweisungopen()
'a'
steht für Anhängen, oder verwenden Sie'w'
zum Schreiben mit Abschneidenos
(insbesondere os.linesep
)Sie sollten die print()
-Funktion verwenden, die seit Python 2.6+ verfügbar ist
from __future__ import print_function # Nur für Python 2 erforderlich
print("hallo", file=f)
Für Python 3 benötigen Sie das import
nicht, da die print()
-Funktion Standard ist.
Alternativ könnten Sie verwenden:
f = open('myfile', 'w')
f.write('hallo \n') # Python wandelt \n in os.linesep um
f.close() # in den meisten Fällen können Sie es weglassen, da der Destruktor es aufrufen wird
Zitierend aus der Python-Dokumentation in Bezug auf Zeilenumbrüche:
Beim Ausgeben werden, wenn newline None ist, alle
'\n'
-Zeichen, die geschrieben werden, in den systemeigenen Zeilenumbruchos.linesep
übersetzt. Wenn newline''
ist, findet keine Übersetzung statt. Wenn newline einen anderen gültigen Wert hat, werden alle'\n'
-Zeichen, die geschrieben werden, in den angegebenen String übersetzt.
Die Python-Dokumentation empfiehlt folgende Vorgehensweise:
with open('file_to_write', 'w') as f:
f.write('Dateiinhalt\n')
Das ist also die Art und Weise, wie ich es normalerweise mache :)
Aussage von docs.python.org:
Es ist eine gute Praxis, das Schlüsselwort 'with' beim Umgang mit Dateiobjekten zu verwenden. Dies hat den Vorteil, dass die Datei ordnungsgemäß geschlossen wird, nachdem der Bereich beendet ist, selbst wenn unterwegs eine Ausnahme ausgelöst wird. Außerdem ist es wesentlich kürzer als die Verwendung äquivalenter try-finally-Blöcke.
In Bezug auf os.linesep:
Hier ist eine genaue, unveränderte Python 2.7.1-Interpreter-Sitzung unter Windows:
Python 2.7.1 (r271:86832, 27. Nov 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] auf
win32
Geben Sie "help", "copyright", "credits" oder "license" für mehr Informationen ein.
>>> import os
>>> os.linesep
'\r\n'
>>> f = open('myfile','w')
>>> f.write('hi there\n')
>>> f.write('hi there' + os.linesep) # derselbe Ergebnis wie vorherige Zeile ?????????
>>> f.close()
>>> open('myfile', 'rb').read()
'hi there\r\nhi there\r\r\n'
>>>
Auf Windows:
Wie erwartet, erzeugt os.linesep NICHT das gleiche Ergebnis wie '\n'
. Es gibt keine Möglichkeit, dass es das gleiche Ergebnis liefern könnte. 'hi there' + os.linesep
ist äquivalent zu 'hi there\r\n'
, was NICHT äquivalent zu 'hi there\n'
ist.
Es ist ganz einfach: Verwenden Sie \n
, das automatisch in os.linesep übersetzt wird. Und so einfach war es schon seit der ersten Umsetzung von Python für Windows.
Es macht keinen Sinn, os.linesep auf Non-Windows-Systemen zu verwenden, und es liefert falsche Ergebnisse auf Windows.
VERWENDEN SIE NICHT os.linesep!
Ich denke nicht, dass es einen "richtigen" Weg gibt.
Ich würde verwenden:
with open ('myfile', 'a') as f: f.write ('hallo\n')
In memoriam Tim Toady.
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.