python - variable - Korrekte Art, Zeile in Datei zu schreiben?




python subplot title (6)

Die Python-Dokumente empfehlen diese Vorgehensweise:

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

So mache ich es also :)

Aussage von docs.python.org :

Es empfiehlt sich, beim Umgang mit Dateiobjekten das Schlüsselwort 'with' zu verwenden. Dies hat den Vorteil, dass die Datei nach dem Ende ihrer Suite ordnungsgemäß geschlossen wird, auch wenn auf dem Weg eine Ausnahme ausgelöst wird. Es ist auch viel kürzer als das Schreiben äquivalenter Try-finally-Blöcke.

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

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

Update : In Bezug auf all diese Antworten mit "\n" ... ist das universell oder Unix-spezifisch? IE, sollte ich "\r\n" unter Windows machen?


Dies sollte so einfach sein wie:

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

Aus der Dokumentation:

Verwenden Sie os.linesep als os.linesep , wenn Sie im Textmodus geöffnete Dateien schreiben (Standardeinstellung). Verwenden Sie stattdessen ein einzelnes \ n auf allen Plattformen.

Einige nützliche Lektüre:


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)

Sie sollten die print() Funktion verwenden, 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 benötigen Sie den import , da die Funktion print() die Standardeinstellung ist.

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 aus der Python-Dokumentation zu Zeilenumbrüchen:

Wenn newline in der Ausgabe None ist, werden alle geschriebenen '\n' Zeichen in das Standard-Zeilentrennzeichen des Systems, os.linesep , os.linesep . Wenn newline '' , findet keine Übersetzung statt. Wenn Newline eine der anderen zulässigen Werte ist, werden alle geschriebenen '\n' Zeichen in die angegebene Zeichenfolge übersetzt.


Wenn Sie eine Menge Daten schreiben und Geschwindigkeit ein Thema ist, sollten Sie wahrscheinlich mit f.write(...) . Ich habe einen schnellen Geschwindigkeitsvergleich durchgeführt und es war erheblich schneller als print(..., file=f) wenn eine große Anzahl von Schreibvorgängen durchgeführt wurde.

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 wurde der write in 2.45s auf meinem Rechner beendet, während der print ungefähr viermal so lange dauerte (9.76s). In den meisten realen Szenarien wird dies kein Problem sein.

Wenn Sie sich für print(..., file=f) Sie wahrscheinlich feststellen, dass Sie den Zeilenumbruch von Zeit zu Zeit unterdrücken oder durch etwas anderes ersetzen möchten. Dies kann durch Einstellen des optionalen Endparameters erfolgen, z.

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, ich würde vorschlagen, with da es den Code viel einfacher zu lesen macht.

Update : Dieser Unterschied in der Leistung wird durch die Tatsache erklärt, dass der write stark gepuffert ist und zurückkehrt, bevor tatsächlich auf die Festplatte geschrieben wird (siehe diese Antwort ), während print (wahrscheinlich) Zeilenpufferung verwendet. 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 viel weniger ausgeprägt, mit einer durchschnittlichen Zeit von 2.20 Sekunden für den write und 3.10 Sekunden für den print . Wenn Sie eine Reihe von Strings verketten müssen, um diese loooong Zeile Leistung leiden zu leiden, so sind Anwendungsfälle, in denen print effizienter wäre, ein wenig selten.


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 liefert os.linesep NICHT das gleiche Ergebnis wie '\n' . Es gibt keine Möglichkeit, das gleiche Ergebnis zu erzielen. 'hi there' + os.linesep ist gleichbedeutend mit 'hi there\r\n' , was NICHT 'hi there\n' .

Es ist so einfach: Verwenden Sie \n das automatisch in os.linesep übersetzt wird. 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!





file-io