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?

1562voto

Johnsyweb Punkte 128606

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:

1016voto

sorin Punkte 147675

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 Zeilenumbruch os.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.

134voto

j7nn7k Punkte 16569

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.

93voto

John Machin Punkte 78125

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!

62voto

Hyperboreus Punkte 31109

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.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