it-swarm.com.de

Richtiger Weg, um eine Zeile in eine Datei zu schreiben?

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

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

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

945

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_ nicht als Zeilenabschluss, wenn Sie Dateien schreiben, die im Textmodus geöffnet wurden (Standardeinstellung). Verwenden Sie stattdessen auf allen Plattformen ein einzelnes '\ n'.

Einige nützliche Lektüre:

960
Johnsyweb

Sie sollten die Funktion print() 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 import nicht, da die Funktion print() die Standardeinstellung ist.

Die Alternative wäre zu verwenden:

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

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

941
sorin

Die Python-Dokumente empfehlen diesen Weg:

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

So mache ich das normalerweise :)

Aussage von docs.python.org :

Es wird empfohlen, beim Umgang mit Dateiobjekten das Schlüsselwort 'with' zu verwenden. Dies hat den Vorteil, dass die Datei nach Abschluss der Suite ordnungsgemäß geschlossen wird, auch wenn unterwegs eine Ausnahme ausgelöst wird. Es ist auch viel kürzer als das Schreiben von äquivalenten try-finally-Blöcken.

106
j7nn7k

In Bezug auf 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'
>>>

nter Windows:

Wie erwartet erzeugt os.linesep NOT dasselbe Ergebnis wie '\n'. Es gibt keine Möglichkeit, das gleiche Ergebnis zu erzielen. 'hi there' + os.linesep entspricht 'hi there\r\n', was NICHT entspricht 'hi there\n'.

So einfach ist das: Verwenden Sie \n, das automatisch in os.linesep übersetzt wird. Und so einfach ist es seit dem ersten Port von Python für Windows.

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

BENUTZEN SIE NICHT os.linesep!

85
John Machin

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 memoriam Tim Toady .

53
Hyperboreus

In Python 3 ist es eine Funktion, aber in Python 2 können Sie dies zum Anfang der Quelldatei hinzufügen:

from __future__ import print_function

Dann tust du es

print("hi there", file=f)
21
Keith

Wenn Sie viele Daten schreiben und Geschwindigkeit ein Problem ist, sollten Sie wahrscheinlich f.write(...) wählen. Ich habe einen schnellen Geschwindigkeitsvergleich durchgeführt und er war erheblich schneller als print(..., file=f), wenn eine große Anzahl von Schreibvorgängen ausgefü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)

Durchschnittlich war write in 2,45 Sekunden auf meiner Maschine fertig, während print ungefähr viermal so lange dauerte (9,76 Sekunden). In den meisten realen Szenarien ist dies jedoch kein Problem.

Wenn Sie sich für print(..., file=f) entscheiden, werden 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 optionalen Parameters end erfolgen, z.

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

Welchen Weg Sie auch wählen, ich würde vorschlagen, with zu verwenden, da der Code dadurch viel einfacher zu lesen ist.

Update : Dieser Leistungsunterschied erklärt sich aus der Tatsache, dass write stark gepuffert ist und zurückgegeben wird, bevor tatsächlich auf die Festplatte geschrieben wird (siehe diese Antwort ), während print (wahrscheinlich) die Zeilenpufferung verwendet. Ein einfacher Test hierfür wäre, die Leistung auch für lange Schreibvorgänge zu überprüfen, wobei die Nachteile (in Bezug auf die 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 ist jetzt viel geringer, mit einer durchschnittlichen Zeit von 2,20 s für write und 3,10 s für print. Wenn Sie eine Reihe von Zeichenfolgen verketten müssen, um diese laute Zeilenleistung zu erzielen, leiden die Anwendungsfälle, in denen print effizienter ist, etwas seltener.

16

Seit 3.5 können Sie auch die pathlib verwenden:

Path.write_text (Daten, Kodierung = Keine, Fehler = Keine)

Öffnen Sie die Datei, auf die im Textmodus verwiesen wird, schreiben Sie Daten darauf und schließen Sie die Datei:

import pathlib

pathlib.Path('textfile.txt').write_text('content')
9
johnson

Wenn Sie Line sagten, bedeutet dies, dass einige serialisierte Zeichen mit '\ n' Zeichen enden. Die Zeile sollte irgendwann die letzte sein, daher sollten wir am Ende jeder Zeile '\ n' berücksichtigen. Hier ist Lösung:

with open('YOURFILE.txt', 'a') as the_file:
    the_file.write('Hello')

im Anhänge-Modus bewegt sich der Cursor nach jedem Schreiben in eine neue Zeile. Wenn Sie den 'w'-Modus verwenden möchten, sollten Sie am Ende der write () -Funktion'\n'-Zeichen einfügen:

the_file.write('Hello'+'\n')
4
Reza Tanzifi

Man kann das io Modul auch wie folgt verwenden:

import io
my_string = "hi there"

with io.open("output_file.txt", mode='w', encoding='utf-8') as f:
    f.write(my_string)
3
kmario23

Wenn ich häufig neue Zeilen schreiben muss, definiere ich ein Lambda, das eine Funktion print verwendet:

out = open(file_name, 'w')
fwl = lambda *x, **y: print(*x, **y, file=out) # FileWriteLine
fwl('Hi')

Dieser Ansatz hat den Vorteil, dass alle Funktionen verwendet werden können, die mit der Funktion print verfügbar sind.

Update: Wie von Georgy im Kommentarbereich erwähnt, ist es möglich, diese Idee mit der Funktion partial weiter zu verbessern:

from functools import partial
fwl = partial(print, file=out)

Meiner Meinung nach ist dies ein funktionaler und weniger kryptischer Ansatz.

0
MxNx

Sie können auch filewriter versuchen.

pip install filewriter

from filewriter import Writer

Writer(filename='my_file', ext='txt') << ["row 1 hi there", "row 2"]

Schreibt in my_file.txt

Nimmt ein iterables oder ein Objekt mit __str__ -Unterstützung an.

0