Beachten Sie, dass writelineskeine Zeilenumbrüche hinzugefügt werden, da diese gespiegelt werden readlinesund diese auch nicht entfernt werden.
SingleNegationElimination
Antworten:
908
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>> f, item
Wenn Sie an einem einzelnen Funktionsaufruf interessiert sind, entfernen Sie mindestens die eckigen Klammern [], damit die zu druckenden Zeichenfolgen einzeln erstellt werden (ein Genexp anstelle eines Listcomp) - kein Grund, den gesamten erforderlichen Speicher zu belegen die gesamte Liste der Zeichenfolgen zu materialisieren.
Dies ist nicht besonders komplex, aber warum nicht einfach Pickle oder JSON verwenden, damit Sie sich nicht um die Serialisierung und Deserialisierung kümmern müssen?
Jason Baker
82
Zum Beispiel, weil Sie eine Ausgabetextdatei möchten, die mit einem Element pro Zeile leicht gelesen, bearbeitet usw. werden kann. Kaum ein seltener Wunsch ;-).
Alex Martelli
1
Ich fand, dass das \ n im ersten unter Python 2.7 / Windows
Jorge Rodriguez
11
Dies wird ein zusätzliches Zeilenumbruchzeichen am Ende schreiben ... anstatt einer Schleife könnten Sie einfach schreibenthefile.write('\n'.join(thelist))
Tgsmith61591
3
Ich würde hinzufügen: "Seien Sie vorsichtig mit dem Listendatentyp". Ich habe einige seltsame Ergebnisse erzielt, vielleicht kann dies jemandem helfen:thefile.write(str(item) + "\n")
iipr
383
Was machst du mit der Datei? Existiert diese Datei für Menschen oder andere Programme mit klaren Interoperabilitätsanforderungen?
Wenn Sie nur versuchen, eine Liste zur späteren Verwendung durch dieselbe Python-App auf die Festplatte zu serialisieren, sollten Sie die Liste auswählen .
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)
+1 - Warum das Rad neu erfinden, wenn in Python die Serialisierung integriert ist?
Jason Baker
20
+1 - outfile ist so etwas wie: open( "save.p", "wb" ) infile ist so etwas wie:open( "save.p", "rb" )
xxjjnn
2
Das Problem ist, dass die Liste in den Speicher passen muss. Wenn dies nicht der Fall ist, ist Zeile für Zeile in der Tat eine mögliche Strategie (oder eine Alternative wie in stackoverflow.com/questions/7180212/… )
Filippo Mazza
1
Verwenden Sie in Python 2 'r' anstelle von 'rb', wenn Sie die Pickle lesen, wenn Sie den "ValueError: Unsure String Pickle" erhalten
Warteschlange
1
@serafeim: nein; Der with:Block schließt die Datei, bevor mit der nächsten Anweisung außerhalb des withBlocks fortgefahren wird.
SingleNegationElimination
285
Der einfachere Weg ist:
with open("outfile","w")as outfile:
outfile.write("\n".join(itemlist))
Sie können mithilfe eines Generatorausdrucks sicherstellen, dass alle Elemente in der Elementliste Zeichenfolgen sind:
with open("outfile","w")as outfile:
outfile.write("\n".join(str(item)for item in itemlist))
Denken Sie daran, dass sich alle itemlistListen im Speicher befinden müssen. Achten Sie daher auf den Speicherverbrauch.
Kein nachfolgender Zeilenumbruch, verwendet im Vergleich zur Schleife 2x Leerzeichen.
Dave
7
Die erste Frage, die sich stellt, ist natürlich, ob das OP es benötigt, um in einer neuen Zeile zu enden, und ob der Platzbedarf wichtig ist oder nicht. Sie wissen, was sie über vorzeitige Optimierungen sagen.
Jason Baker
15
Ein Nachteil: Hiermit wird der gesamte Inhalt der Datei im Speicher erstellt, bevor eine davon ausgeschrieben wird. Daher kann die maximale Speichernutzung hoch sein.
RobM
4
Ich kann das nie zum Laufen bringen. Ich erhalte die folgende Fehlermeldung: "text = '\ n'.join (namelist) +' \ n 'TypeError: Sequenzelement 0: erwartete Zeichenfolge, Liste gefunden"
Dan
2
Sie müssen sicherstellen, dass alle Elemente in der Namensliste Zeichenfolgen sind.
Osantana
94
Verwenden der Syntax von Python 3 und Python 2.6+ :
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 Zeilenumbruchzeichen abgeschlossen. Dies ist eine bewährte Methode für UNIX .
Ab Python 3.6 "{}\n".format(item)kann durch einen F-String ersetzt werden : f"{item}\n".
Ich dachte, es wäre interessant, die Vorteile der Verwendung eines Genexp zu untersuchen. Hier ist meine Meinung.
Das Beispiel in der Frage verwendet eckige Klammern, um eine temporäre Liste zu erstellen. Dies entspricht:
file.writelines( list("%s\n"% item for item in list ))
Dadurch wird unnötig eine temporäre Liste aller Zeilen erstellt, die ausgeschrieben werden. Dies kann je nach Größe Ihrer Liste und der Ausführlichkeit der Ausgabe erhebliche Speichermengen beanspruchen str(item).
Wenn Sie die eckigen Klammern entfernen (entspricht dem Entfernen des list()obigen Wrapping- Aufrufs), wird stattdessen ein temporärer Generator an Folgendes übergebenfile.writelines() :
file.writelines("%s\n"% item for item in list )
Dieser Generator erstellt bei Bedarf eine Newline-terminierte Darstellung Ihrer itemObjekte (dh wie sie ausgeschrieben sind). Das ist aus mehreren Gründen schön:
Der Speicheraufwand ist selbst bei sehr großen Listen gering
Wenn str(item)es langsam ist, gibt es sichtbaren Fortschritt in der Datei, während jedes Element verarbeitet wird
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:InternalPython error in the inspect module.Belowis the traceback from this internal error.Traceback(most recent call last):...MemoryError
(Ich habe diesen Fehler ausgelöst, indem ich Pythons maximalen virtuellen Speicher auf ~ 100 MB mit begrenzt habe ulimit -v 102400).
Wenn Sie die Speichernutzung beiseite lassen, ist diese Methode 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
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 objectwith open('test.txt','r')as f:
a = json.loads(f.read())
import json; test_list = [1,2,3]; list_as_a_string = json.dumps (test_list); #list_as_a_string ist jetzt die Zeichenfolge '[1,2,3]'
CommandoScorch
Ich mache das with open ('Sp1.txt', 'a') as outfile:json.dump (sp1_segments, outfile)logger.info ("Saved sp_1 segments"); Das Problem ist, dass mein Programm dreimal ausgeführt wird und die Ergebnisse von drei Läufen zusammengeführt werden. Gibt es eine Möglichkeit, 1-2 leere Zeilen hinzuzufügen, damit die Ergebnisse aus jedem Lauf erkennbar sind?
KRazzy R
1
Absolut! könnten Sie stattdessen tun json.dump(sp1_segments + "\n\n", outfile)?
CommandoScorch
19
Serialisieren Sie die Liste in eine Textdatei mit einem durch Kommas getrennten Wert
#!/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()
Diese Logik konvertiert zuerst die Elemente in der Liste in string(str). Manchmal enthält die Liste ein Tupel wie
alist =[(i12,tiger),(113,lion)]
Diese Logik schreibt, um jedes Tupel in einer neuen Zeile abzulegen. Wir können später evalbeim Laden jedes Tupels beim Lesen der Datei Folgendes verwenden:
outfile = open('outfile.txt','w')# open a file in write modefor item in list_to_persistence:# iterate over the list items
outfile.write(str(item)+'\n')# write to the file
outfile.close()# close the file
poem ='''\
Programming is fun
When the work is done
if you wanna make your work also fun:
use Python!
'''
f = open('poem.txt','w')# open for 'w'riting
f.write(poem)# write text to file
f.close()# close the file
So funktioniert es: Öffnen Sie zunächst eine Datei, indem Sie die integrierte Öffnungsfunktion verwenden und den Namen der Datei sowie den Modus angeben, in dem die Datei geöffnet werden soll. Der Modus kann ein Lesemodus ('r'), ein Schreibmodus ('w') oder ein Anhänge-Modus ('a') sein. Wir können auch angeben, ob wir im Textmodus ('t') oder im Binärmodus ('b') lesen, schreiben oder anhängen. Es gibt tatsächlich viel mehr Modi und die Hilfe (offen) gibt Ihnen mehr Details darüber. Standardmäßig betrachtet open () die Datei als 't'ext-Datei' und öffnet sie im 'r'ead-Modus. In unserem Beispiel öffnen wir zuerst die Datei im Schreibtextmodus und verwenden die Schreibmethode des Dateiobjekts, um in die Datei zu schreiben. Anschließend schließen wir die Datei endgültig.
Das obige Beispiel stammt aus dem Buch "A Byte of Python" von Swaroop C H. swaroopch.com
writelines
keine Zeilenumbrüche hinzugefügt werden, da diese gespiegelt werdenreadlines
und diese auch nicht entfernt werden.Antworten:
Sie können eine Schleife verwenden:
In Python 2 können Sie auch verwenden
Wenn Sie an einem einzelnen Funktionsaufruf interessiert sind, entfernen Sie mindestens die eckigen Klammern
[]
, damit die zu druckenden Zeichenfolgen einzeln erstellt werden (ein Genexp anstelle eines Listcomp) - kein Grund, den gesamten erforderlichen Speicher zu belegen die gesamte Liste der Zeichenfolgen zu materialisieren.quelle
thefile.write('\n'.join(thelist))
thefile.write(str(item) + "\n")
Was machst du mit der Datei? Existiert diese Datei für Menschen oder andere Programme mit klaren Interoperabilitätsanforderungen?
Wenn Sie nur versuchen, eine Liste zur späteren Verwendung durch dieselbe Python-App auf die Festplatte zu serialisieren, sollten Sie die Liste auswählen .
Um es zurückzulesen:
quelle
open( "save.p", "wb" )
infile ist so etwas wie:open( "save.p", "rb" )
with:
Block schließt die Datei, bevor mit der nächsten Anweisung außerhalb deswith
Blocks fortgefahren wird.Der einfachere Weg ist:
Sie können mithilfe eines Generatorausdrucks sicherstellen, dass alle Elemente in der Elementliste Zeichenfolgen sind:
Denken Sie daran, dass sich alle
itemlist
Listen im Speicher befinden müssen. Achten Sie daher auf den Speicherverbrauch.quelle
Verwenden der Syntax von Python 3 und Python 2.6+ :
Dies ist plattformunabhängig. Außerdem wird die letzte Zeile mit einem Zeilenumbruchzeichen abgeschlossen. Dies ist eine bewährte Methode für UNIX .
Ab Python 3.6
"{}\n".format(item)
kann durch einen F-String ersetzt werden :f"{item}\n"
.quelle
file_handler.write("\n".join(str(item) for item in the_list))
Noch ein anderer Weg. Serialisieren Sie mit simplejson zu json ( in Python 2.6 als json enthalten ):
Wenn Sie output.txt untersuchen:
Dies ist nützlich, da die Syntax pythonisch ist, von Menschen gelesen werden kann und von anderen Programmen in anderen Sprachen gelesen werden kann.
quelle
Ich dachte, es wäre interessant, die Vorteile der Verwendung eines Genexp zu untersuchen. Hier ist meine Meinung.
Das Beispiel in der Frage verwendet eckige Klammern, um eine temporäre Liste zu erstellen. Dies entspricht:
Dadurch wird unnötig eine temporäre Liste aller Zeilen erstellt, die ausgeschrieben werden. Dies kann je nach Größe Ihrer Liste und der Ausführlichkeit der Ausgabe erhebliche Speichermengen beanspruchen
str(item)
.Wenn Sie die eckigen Klammern entfernen (entspricht dem Entfernen des
list()
obigen Wrapping- Aufrufs), wird stattdessen ein temporärer Generator an Folgendes übergebenfile.writelines()
:Dieser Generator erstellt bei Bedarf eine Newline-terminierte Darstellung Ihrer
item
Objekte (dh wie sie ausgeschrieben sind). Das ist aus mehreren Gründen schön:str(item)
es langsam ist, gibt es sichtbaren Fortschritt in der Datei, während jedes Element verarbeitet wirdDies vermeidet Speicherprobleme wie:
(Ich habe diesen Fehler ausgelöst, indem ich Pythons maximalen virtuellen Speicher auf ~ 100 MB mit begrenzt habe
ulimit -v 102400
).Wenn Sie die Speichernutzung beiseite lassen, ist diese Methode nicht schneller als das Original:
(Python 2.6.2 unter Linux)
quelle
Weil ich faul bin....
quelle
with open ('Sp1.txt', 'a') as outfile:
json.dump (sp1_segments, outfile)
logger.info ("Saved sp_1 segments")
; Das Problem ist, dass mein Programm dreimal ausgeführt wird und die Ergebnisse von drei Läufen zusammengeführt werden. Gibt es eine Möglichkeit, 1-2 leere Zeilen hinzuzufügen, damit die Ergebnisse aus jedem Lauf erkennbar sind?json.dump(sp1_segments + "\n\n", outfile)
?Serialisieren Sie die Liste in eine Textdatei mit einem durch Kommas getrennten Wert
quelle
Allgemein
Es folgt die Syntax für die Methode writelines ()
Beispiel
Referenz
http://www.tutorialspoint.com/python/file_writelines.htm
quelle
quelle
file
Variable?quelle
Sie können die Druckfunktion auch wie folgt verwenden, wenn Sie sich in Python3 befinden.
quelle
Warum versuchst du es nicht?
quelle
Diese Logik konvertiert zuerst die Elemente in der Liste in
string(str)
. Manchmal enthält die Liste ein Tupel wieDiese Logik schreibt, um jedes Tupel in einer neuen Zeile abzulegen. Wir können später
eval
beim Laden jedes Tupels beim Lesen der Datei Folgendes verwenden:quelle
Eine andere Möglichkeit zum Iterieren und Hinzufügen von Zeilenumbrüchen:
quelle
In Python> 3 können Sie
print
und*
zum Entpacken von Argumenten verwenden:quelle
In Python3 können Sie diese Schleife verwenden
quelle
Sei avg die Liste, dann:
Sie können
%e
oder%s
je nach Ihren Anforderungen verwenden.quelle
So funktioniert es: Öffnen Sie zunächst eine Datei, indem Sie die integrierte Öffnungsfunktion verwenden und den Namen der Datei sowie den Modus angeben, in dem die Datei geöffnet werden soll. Der Modus kann ein Lesemodus ('r'), ein Schreibmodus ('w') oder ein Anhänge-Modus ('a') sein. Wir können auch angeben, ob wir im Textmodus ('t') oder im Binärmodus ('b') lesen, schreiben oder anhängen. Es gibt tatsächlich viel mehr Modi und die Hilfe (offen) gibt Ihnen mehr Details darüber. Standardmäßig betrachtet open () die Datei als 't'ext-Datei' und öffnet sie im 'r'ead-Modus. In unserem Beispiel öffnen wir zuerst die Datei im Schreibtextmodus und verwenden die Schreibmethode des Dateiobjekts, um in die Datei zu schreiben. Anschließend schließen wir die Datei endgültig.
Das obige Beispiel stammt aus dem Buch "A Byte of Python" von Swaroop C H. swaroopch.com
quelle