Frage Korrekte Art, Zeile in Datei zu schreiben?


Ich bin es gewohnt print >>f, "hi there"

Es scheint jedoch, dass print >> wird veraltet. Was ist die empfohlene Vorgehensweise für die obige Zeile?

Aktualisieren: Bezüglich all dieser Antworten mit "\n"... ist das universell oder Unix-spezifisch? IE, sollte ich tun "\r\n" unter Windows?


773
2018-05-28 05:44


Ursprung


Antworten:


Dies sollte so einfach sein wie:

with open('somefile.txt', 'a') as the_file:
    the_file.write('Hello\n')

Aus der Dokumentation:

Verwende nicht os.linesep als Zeilenabschlusszeichen beim Schreiben von Dateien, die im Textmodus geöffnet sind (Standard); Verwenden Sie stattdessen ein einzelnes \ n auf allen Plattformen.

Einige nützliche Lektüre:


694
2018-05-28 06:36



Du solltest das benutzen print() Funktion, die seit Python 2.6+ verfügbar ist

from __future__ import print_function  # Only needed for Python 2
print("hi there", file=f)

Für Python 3 brauchst du das nicht import, seit der print() Funktion ist die Standardeinstellung.

Die Alternative wäre:

f = open('myfile', 'w')
f.write('hi there\n')  # python will convert \n to os.linesep
f.close()  # you can omit in most cases as the destructor will call it

Zitat von Python-Dokumentation in Bezug auf Zeilenumbrüche:

Bei der Ausgabe, wenn Newline None, any ist '\n' geschriebene Zeichen werden in das Standard-Zeilentrennzeichen des Systems übersetzt, os.linesep. Wenn Newline ist ''Es findet keine Übersetzung statt. Wenn Newline einer der anderen zulässigen Werte ist, '\n' Die geschriebenen Zeichen werden in die angegebene Zeichenfolge übersetzt.


897
2018-05-28 05:48



Das Python-Dokumente empfehle diesen Weg:

with open('file_to_write', 'w') as f:
    f.write('file contents')

So mache ich es normalerweise :)

Aussage von docs.python.org:

Es ist eine gute Übung, die 'mit' Stichwort beim Umgang mit Datei   Objekte. Dies hat den Vorteil, dass die Datei danach ordnungsgemäß geschlossen wird   Die Suite endet, auch wenn auf dem Weg eine Ausnahme gemacht wird. Es ist   auch viel kürzer als das Schreiben äquivalenter try-finally-Blöcke.


91
2017-10-13 09:37



Betreffend os.linesep:

Hier ist eine exakte unbearbeitete Python 2.7.1 Interpretersitzung unter Windows:

Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.linesep
'\r\n'
>>> f = open('myfile','w')
>>> f.write('hi there\n')
>>> f.write('hi there' + os.linesep) # same result as previous line ?????????
>>> f.close()
>>> open('myfile', 'rb').read()
'hi there\r\nhi there\r\r\n'
>>>

Unter Windows:

Wie erwartet, tut os.linesep NICHT produzieren das gleiche Ergebnis wie '\n'. Es gibt keine Möglichkeit, das gleiche Ergebnis zu erzielen. 'hi there' + os.linesep ist äquivalent zu 'hi there\r\n', welches ist NICHT gleichwertig 'hi there\n'.

Es ist so einfach: benutzen \n Das wird automatisch in os.linesep übersetzt. Seit dem ersten Python-Port von Windows ist es so einfach.

Es macht keinen Sinn, os.linesep auf Nicht-Windows-Systemen zu verwenden, und es führt zu falschen Ergebnissen unter Windows.

Verwenden Sie os.linesep NICHT!


80
2018-05-29 03:02



Ich glaube nicht, dass es einen "richtigen" Weg gibt.

Ich würde ... benutzen:

with open ('myfile', 'a') as f: f.write ('hi there\n')

In Erinnerung Tim Toady.


46
2018-05-28 05:48



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 tust du es

print("hi there", file=f)

17
2018-05-28 05:49



Wenn Sie eine Menge Daten schreiben und Geschwindigkeit ist ein Problem, mit dem Sie wahrscheinlich gehen sollten f.write(...). Ich habe einen schnellen Geschwindigkeitsvergleich gemacht und es war erheblich schneller als print(..., file=f) wenn eine große Anzahl von Schreibvorgängen ausgefü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 write fertig in 2.45s auf meiner Maschine, während print nahm etwa 4 mal so lange (9.76s). In den meisten realen Szenarien wird dies kein Problem sein.

Wenn Sie sich entscheiden, mitzugehen print(..., file=f) Sie werden wahrscheinlich feststellen, dass Sie den Zeilenumbruch von Zeit zu Zeit unterdrücken oder durch etwas anderes ersetzen möchten. Dies kann durch Einstellen der Option erfolgen end Parameter z.B.

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

Welchen Weg du auch wählst würde ich empfehlen with weil es den Code viel einfacher zu lesen macht.

Aktualisieren: Dieser Leistungsunterschied erklärt sich dadurch, dass write ist stark gepuffert und kehrt zurück, bevor irgendwelche Schreibvorgänge auf der Platte tatsächlich stattfinden (siehe diese Antwort), wohingegen print (wahrscheinlich) verwendet Zeilenpufferung. Ein einfacher Test hierfür wäre, die Leistung auch für lange Schreibvorgänge zu überprüfen, bei denen die Nachteile (hinsichtlich der Geschwindigkeit) für die Zeilenpufferung weniger 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 jetzt mit einer durchschnittlichen Zeit von 2.20s für viel weniger ausgeprägt write und 3.10s für print. Wenn Sie eine Reihe von Strings verketten müssen, um diese LoaOong-Zeile Leistung leidet leiden, so Use-Fälle, wo print wäre effizienter, sind ein bisschen selten.


14
2017-09-13 16:20