it-swarm.com.de

Eine Liste mit Python in eine Datei schreiben

Ist dies die sauberste Methode, eine Liste in eine Datei zu schreiben, da writelines() keine Zeilenvorschubzeichen einfügt?

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

Es scheint, als gäbe es einen Standardweg ...

470
Josh Arenberg

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 verwenden

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

Wenn Sie sich für einen einzelnen Funktionsaufruf interessieren, entfernen Sie mindestens die eckigen Klammern [], sodass die zu druckenden Zeichenfolgen einzeln erstellt werden (ein Genexp statt ein Listcomp) - kein Grund, den gesamten Speicher zu belegen erforderlich, um die gesamte Liste der Strings zu materialisieren.

654
Alex Martelli

Was machen Sie mit der Datei? Ist diese Datei für Menschen oder andere Programme mit klaren Interoperabilitätsanforderungen vorhanden, oder versuchen Sie nur, eine Liste für die spätere Verwendung durch dieselbe Python-App auf Platte zu serialisieren. Wenn der zweite Fall es ist, sollten Sie pickleing die Liste sein.

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)

Der beste Weg ist:

outfile.write("\n".join(itemlist))
217
osantana

Noch ein anderer Weg. Serialize 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]

Dies ist nützlich, da die Syntax Pythonic ist, sie ist für Menschen lesbar und kann von anderen Programmen in anderen Sprachen gelesen werden.

81
Jason Baker

Verwenden der Python 3 - und 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 Zeilenvorschub abgeschlossen, bei dem es sich um ein UNIX-Verfahren handelt.

80
orluke

Ich dachte, es wäre interessant, die Vorteile der Verwendung von Genexp zu erkunden. Hier ist mein Take.

Das Beispiel in der Frage verwendet eckige Klammern, um eine temporäre Liste zu erstellen. Sie entspricht also:

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

Dadurch wird unnötigerweise eine temporäre Liste aller Zeilen erstellt, die ausgeschrieben werden. Dies kann je nach Größe der Liste und wie umfangreich die Ausgabe von str(item) ist, viel Speicherplatz beanspruchen.

Lassen Sie die eckigen Klammern fallen (entspricht dem Entfernen des Wraps list() oben) und übergeben Sie stattdessen einen temporären generator an file.writelines():

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

Dieser Generator erstellt bei Bedarf eine Zeilenvorschubdarstellung Ihrer item-Objekte (d. H. Wenn sie ausgeschrieben sind). Dies ist aus mehreren Gründen schön:

  • Der Speicheraufwand ist selbst für sehr große Listen klein
  • Wenn str(item) langsam ist, wird bei der Verarbeitung jedes Elements ein Fortschritt in der Datei sichtbar

Dies vermeidet Speicherprobleme wie:

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 der maximale virtuelle Speicher von Python mit ulimit -v 102400 auf ~ 100 MB begrenzt wurde.).

Wenn Sie die Speichernutzung auf eine Seite stellen, ist diese Methode eigentlich nicht 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)

34
RobM

Serialisieren Sie die Liste in eine Textdatei mit durch Kommas getrennten Werten

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

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())
14
CommandoScorch

Im Algemeinen

Nachfolgend finden Sie die Syntax für die Methode writelines ()

fileObject.writelines( sequence )

Beispiel

#!/usr/bin/python

# Open a file
fo = open("foo.txt", "rw+")
seq = ["This is 6th line\n", "This is 7th line"]

# Write sequence of lines at the end of the file.
line = fo.writelines( seq )

# Close opend file
fo.close()

Referenz

http://www.tutorialspoint.com/python/file_writelines.htm

13
Marvin W
file.write('\n'.join(list))
11
mtasic85
with open ("test.txt","w")as fp:
   for line in list12:
       fp.write(line+"\n")
7
shankar

Sie können die Druckfunktion auch verwenden, wenn Sie mit Python3 wie folgt arbeiten.

f = open("myfile.txt","wb")
print(mylist, file=f)
5

Warum versuchst du es nicht?

file.write(str(list))
2
Bob

Diese Logik konvertiert zuerst die Elemente in der Liste in string(str). Manchmal enthält die Liste ein Tupel-ähnliches 

alist = [(i12,tiger), 
(113,lion)]

Diese Logik schreibt jedes Tuple in eine neue Zeile. Wir können später eval verwenden, während wir die einzelnen Tuple laden, wenn sie die Datei lesen: 

outfile = open('outfile.txt', 'w') # open a file in write mode
for item in list_to_persistence:    # iterate over the list items
   outfile.write(str(item) + '\n') # write to the file
outfile.close()   # close the file 
1
Tahir Ahmad

Eine weitere Möglichkeit zum Durchlaufen und Hinzufügen von Zeilenumbrüchen: 

for item in items:
    filewriter.write(f"{item}" + "\n")
0
Alex