980 Stimmen

Schreiben einer Liste in eine Datei mit Python

Ist dies der sauberste Weg, um eine Liste in eine Datei zu schreiben, da writelines() fügt keine Zeilenumbrüche ein?

file.writelines(["%s\n" % item  for item in list])

Es scheint, als gäbe es eine Standardmethode...

53 Stimmen

Beachten Sie bitte, dass writelines fügt keine Zeilenumbrüche hinzu, weil es die readlines was sie ebenfalls nicht entfernt.

1 Stimmen

Es zwischen json vs pickle. lesen Sie alles darüber - stackoverflow.com/questions/27745500/

1315voto

Alex Martelli Punkte 805329

Sie können eine Schleife verwenden:

with open('your_file.txt', 'w') as f:
    for item in my_list:
        f.write("%s\n" % item)

In Python 2 können Sie auch

with open('your_file.txt', 'w') as f:
    for item in my_list:
        print >> f, item

Wenn Sie auf einen einzelnen Funktionsaufruf Wert legen, sollten Sie zumindest die eckigen Klammern entfernen [] so dass die zu druckenden Zeichenketten eine nach der anderen erstellt werden (ein genexp anstelle eines listcomp) -- kein Grund, den gesamten Speicher zu belegen, der erforderlich ist, um die gesamte Liste der Zeichenketten zu materialisieren.

9 Stimmen

Das ist nicht sonderlich komplex, aber warum nicht einfach pickle oder json verwenden, so dass Sie sich nicht um die Serialisierung und Deserialisierung kümmern müssen?

116 Stimmen

Zum Beispiel, weil Sie eine Textdatei ausgeben möchten, die leicht gelesen, bearbeitet usw. werden kann, mit einem Eintrag pro Zeile. Das ist kein seltener Wunsch;-).

1 Stimmen

Ich habe festgestellt, dass die \n in der ersten Version war unter Python 2.7/Windows überflüssig

501voto

Was werden Sie mit der Datei tun? Gibt es diese Datei für Menschen oder andere Programme mit klaren Interoperabilitätsanforderungen?

Wenn Sie nur versuchen, eine Liste auf der Festplatte für die spätere Verwendung durch die gleiche Python-Anwendung zu serialisieren, sollten Sie Beizen die Liste.

import pickle

with open('outfile', 'wb') as fp:
    pickle.dump(itemlist, fp)

Um es zurückzulesen:

with open ('outfile', 'rb') as fp:
    itemlist = pickle.load(fp)

42 Stimmen

+1 - Warum das Rad neu erfinden, wenn Python die Serialisierung eingebaut hat?

20 Stimmen

+1 - outfile ist etwa so: open( "save.p", "wb" ) infile ist etwa so: open( "save.p", "rb" )

3 Stimmen

Das Problem ist, dass die Liste in den Speicher passen muss. Wenn dies nicht der Fall ist, ist Zeile für Zeile eine mögliche Strategie (oder eine Alternative wie in stackoverflow.com/questions/7180212/ )

449voto

osantana Punkte 6157

Der einfachere Weg ist:

with open("outfile", "w") as outfile:
    outfile.write("\n".join(itemlist))

Mit einem Generatorausdruck können Sie sicherstellen, dass alle Elemente in der Elementliste Zeichenketten sind:

with open("outfile", "w") as outfile:
    outfile.write("\n".join(str(item) for item in itemlist))

Denken Sie daran, dass alle itemlist Liste muss sich im Speicher befinden, achten Sie also auf den Speicherverbrauch.

37 Stimmen

Kein abschließender Zeilenumbruch, benötigt 2x Platz im Vergleich zur Schleife.

9 Stimmen

Die erste Frage, die mir in den Sinn kommt, ist natürlich, ob der OP einen Zeilenumbruch am Ende braucht und ob die Anzahl der Leerzeichen eine Rolle spielt oder nicht. Sie wissen ja, was man über verfrühte Optimierungen sagt.

25 Stimmen

Ein Nachteil: Der gesamte Inhalt der Datei wird im Speicher konstruiert, bevor er herausgeschrieben wird, so dass es zu einem hohen Speicherverbrauch kommen kann.

107voto

orluke Punkte 2004

Verwendung von Python 3 y Python 2.6+ Syntax:

with open(filepath, 'w') as file_handler:
    for item in the_list:
        file_handler.write("{}\n".format(item))

Dies ist plattformunabhängig. Außerdem wird die letzte Zeile mit einem Zeilenumbruch abgeschlossen, der ein Bewährte UNIX-Verfahren .

Beginnend mit Python 3.6, "{}\n".format(item) kann durch eine f-Zeichenkette ersetzt werden: f"{item}\n" .

1 Stimmen

Ich möchte nicht hinzufügen " \n "Was ist beim letzten Punkt zu tun? Ich möchte keine if-Bedingung.

6 Stimmen

@pyd Ersetzen Sie die for-Schleife durch file_handler.write("\n".join(str(item) for item in the_list))

0 Stimmen

Mögliches Duplikat von: stackoverflow.com/a/899176/9962007

97voto

Jason Baker Punkte 180981

Ein anderer Weg. Serialisieren zu json mit simplejson (enthalten als json in Python 2.6):

>>> import simplejson
>>> f = open('output.txt', 'w')
>>> simplejson.dump([1,2,3,4], f)
>>> f.close()

Wenn Sie output.txt untersuchen:

[1, 2, 3, 4]

Das ist nützlich, weil die Syntax pythonisch ist, sie ist für Menschen lesbar und kann von anderen Programmen in anderen Sprachen gelesen werden.

1 Stimmen

Dies ist viel besser für mehrzeilige Zeichenfolgen

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