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/

44voto

RobM Punkte 7755

Ich dachte, es wäre interessant, die Vorteile der Verwendung eines Genexp zu untersuchen.

Das Beispiel in der Frage verwendet eckige Klammern, um eine temporäre Liste zu erstellen, und ist daher äquivalent zu:

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

was unnötigerweise eine temporäre Liste aller Zeilen erstellt, die ausgegeben werden sollen. Dies kann erhebliche Mengen an Speicher verbrauchen, abhängig von der Größe Ihrer Liste und davon, wie ausführlich die Ausgabe von str(item) ist.

Entfernen Sie die eckigen Klammern (entspricht dem Entfernen des Umschlags list() Aufruf oben) wird stattdessen eine temporäre Generator a file.writelines() :

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

Dieser Generator erzeugt eine durch Zeilenumbruch abgeschlossene Darstellung Ihrer item Objekte auf Abruf (d.h. wenn sie ausgeschrieben werden). Dies ist aus mehreren Gründen sinnvoll:

  • Der Speicherbedarf ist gering, selbst bei sehr großen Listen.
  • Si str(item) langsam ist, gibt es einen sichtbaren Fortschritt in der Datei, wenn jedes Element verarbeitet wird

Dadurch werden Speicherprobleme vermieden, wie z. B:

In [1]: import os

In [2]: f = file(os.devnull, "w")

In [3]: %timeit f.writelines( "%s\n" % item for item in xrange(2**20) )
1 loops, best of 3: 385 ms per loop

In [4]: %timeit f.writelines( ["%s\n" % item for item in xrange(2**20)] )
ERROR: Internal Python error in the inspect module.
Below is the traceback from this internal error.

Traceback (most recent call last):
...
MemoryError

(Ich habe diesen Fehler ausgelöst, indem ich den maximalen virtuellen Speicher von Python auf ~100MB begrenzt habe mit ulimit -v 102400 ).

Abgesehen von der Speichernutzung ist diese Methode nicht wirklich schneller als das Original:

In [4]: %timeit f.writelines( "%s\n" % item for item in xrange(2**20) )
1 loops, best of 3: 370 ms per loop

In [5]: %timeit f.writelines( ["%s\n" % item for item in xrange(2**20)] )
1 loops, best of 3: 360 ms per loop

(Python 2.6.2 unter Linux)

31voto

Big Sam Punkte 1031

Weil ich faul bin....

import json
a = [1,2,3]
with open('test.txt', 'w') as f:
    f.write(json.dumps(a))

#Now read the file back into a Python list object
with open('test.txt', 'r') as f:
    a = json.loads(f.read())

0 Stimmen

Sind Listen json serialisierbar?

1 Stimmen

Ja, das sind sie!

1 Stimmen

Import json ; test_list = [1,2,3]; list_as_a_string = json.dumps(test_list); #list_as_a_string ist jetzt der String '[1,2,3]'

26voto

bricoletc Punkte 328

In Python>3 können Sie verwenden print y * zum Auspacken von Argumenten:

with open("fout.txt", "w") as fout:
    print(*my_list, sep="\n", file=fout)

21voto

themadmax Punkte 2166

Serialisierung der Liste in eine Textdatei mit kommaseparierten Werten

mylist = dir()
with open('filename.txt','w') as f:
    f.write( ','.join( mylist ) )

18voto

Ahmad Masalha Punkte 103

Einfach:

with open("text.txt", 'w') as file:
    file.write('\n'.join(yourList))

0 Stimmen

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