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...
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...
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:
str(item)
langsam ist, gibt es einen sichtbaren Fortschritt in der Datei, wenn jedes Element verarbeitet wirdDadurch 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)
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]'
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.
53 Stimmen
Beachten Sie bitte, dass
writelines
fügt keine Zeilenumbrüche hinzu, weil es diereadlines
was sie ebenfalls nicht entfernt.1 Stimmen
Es zwischen json vs pickle. lesen Sie alles darüber - stackoverflow.com/questions/27745500/