Is dit de schoonste manier om een lijst naar een bestand te schrijven, aangezien writelines()
geen nieuwe regeltekens invoegt?
file.writelines(["%s\n" % item for item in list])
Het lijkt erop dat er een standaard manier zou zijn…
Antwoord 1, autoriteit 100%
U kunt een lus gebruiken:
with open('your_file.txt', 'w') as f:
for item in my_list:
f.write("%s\n" % item)
In Python 2 kun je ook
with open('your_file.txt', 'w') as f:
for item in my_list:
print >> f, item
Als je geïnteresseerd bent in een enkele functie-aanroep, verwijder dan op zijn minst de vierkante haken []
, zodat de te printen strings één voor één gemaakt worden (een genexp in plaats van een listcomp ) — geen reden om al het geheugen in beslag te nemen dat nodig is om de hele lijst met strings te maken.
Antwoord 2, autoriteit 40%
Wat gaat u met het bestand doen? Bestaat dit bestand voor mensen of andere programma’s met duidelijke interoperabiliteitsvereisten?
Als je alleen een lijst probeert te serialiseren naar schijf voor later gebruik door dezelfde python-app, moet je beitsende lijst.
import pickle
with open('outfile', 'wb') as fp:
pickle.dump(itemlist, fp)
Om het terug te lezen:
with open ('outfile', 'rb') as fp:
itemlist = pickle.load(fp)
Antwoord 3, autoriteit 32%
De eenvoudigere manier is:
with open("outfile", "w") as outfile:
outfile.write("\n".join(itemlist))
U kunt ervoor zorgen dat alle items in de itemlijst strings zijn met behulp van een generator-expressie:
with open("outfile", "w") as outfile:
outfile.write("\n".join(str(item) for item in itemlist))
Vergeet niet dat alle itemlist
-lijsten in het geheugen moeten staan, dus let op het geheugengebruik.
Antwoord 4, autoriteit 9%
Gebruik Python 3en Python 2.6+syntaxis:
with open(filepath, 'w') as file_handler:
for item in the_list:
file_handler.write("{}\n".format(item))
Dit is platformonafhankelijk. Het beëindigt ook de laatste regel met een teken voor een nieuwe regel, wat een UNIX-beste oefenen.
Vanaf Python 3.6 kan "{}\n".format(item)
worden vervangen door een f-string: f"{item}\n"
.
Antwoord 5, autoriteit 8%
Nog een andere manier. Serialiseren naar json met behulp van simplejson(opgenomen als jsonin python 2.6):
>>> import simplejson
>>> f = open('output.txt', 'w')
>>> simplejson.dump([1,2,3,4], f)
>>> f.close()
Als je output.txt onderzoekt:
[1, 2, 3, 4]
Dit is handig omdat de syntaxis pythonisch is, door mensen leesbaar en door andere programma’s in andere talen kan worden gelezen.
Antwoord 6, autoriteit 4%
Ik dacht dat het interessant zou zijn om de voordelen van het gebruik van een genexp te onderzoeken, dus hier is mijn mening.
Het voorbeeld in de vraag gebruikt vierkante haken om een tijdelijke lijst te maken, en is dus gelijk aan:
file.writelines( list( "%s\n" % item for item in list ) )
Dat nodeloos een tijdelijke lijst maakt van alle regels die zullen worden weggeschreven, dit kan aanzienlijke hoeveelheden geheugen verbruiken, afhankelijk van de grootte van uw lijst en hoe uitgebreid de uitvoer van str(item)
is.
Laat de vierkante haken vallen (gelijk aan het verwijderen van de omhullende list()
-aanroep hierboven) zal in plaats daarvan een tijdelijke generatornaar file.writelines()
:
file.writelines( "%s\n" % item for item in list )
Deze generator zal on-demand (d.w.z. zoals ze worden uitgeschreven) een weergave van uw item
-objecten maken met een nieuwe regel. Dit is leuk om een aantal redenen:
- De overheadkosten voor het geheugen zijn klein, zelfs voor zeer grote lijsten
- Als
str(item)
traag is, is er zichtbare voortgang in het bestand terwijl elk item wordt verwerkt
Dit voorkomt geheugenproblemen, zoals:
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
(Ik heb deze fout geactiveerd door het maximale virtuele geheugen van Python te beperken tot ~100 MB met ulimit -v 102400
).
Als we het geheugengebruik aan de kant schuiven, deze methode is eigenlijk niet sneller dan het origineel:
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 onder Linux)
Antwoord 7, autoriteit 2%
Omdat ik lui ben….
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())
Antwoord 8, autoriteit 2%
Serialiseer lijst in tekstbestand met door komma’s gescheiden waarde
mylist = dir()
with open('filename.txt','w') as f:
f.write( ','.join( mylist ) )
Antwoord 9
file.write('\n'.join(list))
Antwoord 10
with open ("test.txt","w")as fp:
for line in list12:
fp.write(line+"\n")
Antwoord 11
Je kunt de afdrukfunctie ook als volgt gebruiken als je op python3 werkt.
f = open("myfile.txt","wb")
print(mylist, file=f)
Antwoord 12
In python>3 kun je print
en *
gebruiken voor het uitpakken van argumenten:
with open("fout.txt", "w") as fout:
print(*my_list, sep="\n", file=fout)
Antwoord 13
Waarom probeer je het niet
file.write(str(list))
Antwoord 14
Het gebruik van numpy.savetxt
is ook een optie:
import numpy as np
np.savetxt('list.txt', list, delimiter="\n", fmt="%s")
Antwoord 15
Deze logica zal eerst de items in de lijst converteren naar string(str)
. Soms bevat de lijst een tuple zoals
alist = [(i12,tiger),
(113,lion)]
Deze logica schrijft naar elke tuple in een nieuwe regel. We kunnen later eval
gebruiken tijdens het laden van elke tuple bij het lezen van het bestand:
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
Antwoord 16
Je kunt ook het volgende doen:
Voorbeeld:
my_list=[1,2,3,4,5,"abc","def"]
with open('your_file.txt', 'w') as file:
for item in my_list:
file.write("%s\n" % item)
Uitvoer:
In your_file.txt
worden items opgeslagen zoals:
1
2
3
4
5
abc
def
Je script wordt ook opgeslagen zoals hierboven.
Anders kun je augurk gebruiken
import pickle
my_list=[1,2,3,4,5,"abc","def"]
#to write
with open('your_file.txt', 'wb') as file:
pickle.dump(my_list, file)
#to read
with open ('your_file.txt', 'rb') as file:
Outlist = pickle.load(file)
print(Outlist)
Uitvoer:
[1, 2, 3, 4, 5, ‘abc’, ‘def’]
Het slaat de lijst op dezelfde manier op als een lijst, wanneer we deze laden, kunnen we deze lezen.
Ook door simplejson
mogelijk hetzelfde als bovenstaande uitvoer
import simplejson as sj
my_list=[1,2,3,4,5,"abc","def"]
#To write
with open('your_file.txt', 'w') as file:
sj.dump(my_list, file)
#To save
with open('your_file.txt', 'r') as file:
mlist=sj.load(file)
print(mlist)
Antwoord 17
Een andere manier om te herhalen en een nieuwe regel toe te voegen:
for item in items:
filewriter.write(f"{item}" + "\n")
Antwoord 18
Het omleiden van stdout naar een bestand kan ook nuttig zijn voor dit doel:
from contextlib import redirect_stdout
with open('test.txt', 'w') as f:
with redirect_stdout(f):
for i in range(mylst.size):
print(mylst[i])
Antwoord 19
ik stel deze oplossing voor.
with open('your_file.txt', 'w') as f:
list(map(lambda item : f.write("%s\n" % item),my_list))
Antwoord 20
In Python3kun je deze lus gebruiken
with open('your_file.txt', 'w') as f:
for item in list:
f.print("", item)
Antwoord 21
Geef avg de lijst en dan:
In [29]: a = n.array((avg))
In [31]: a.tofile('avgpoints.dat',sep='\n',dtype = '%f')
U kunt %e
of %s
gebruiken, afhankelijk van uw behoefte.
Antwoord 22
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
Hoe het werkt:
Open eerst een bestand met behulp van de ingebouwde open-functie en specificeer de naam van
het bestand en de modus waarin we het bestand willen openen. De modus kan een
leesmodus ( r ), schrijfmodus ( w ) of toevoegmodus ( a ). We kunnen ook specificeren:
of we nu lezen, schrijven of toevoegen in tekstmodus ( t ) of binair
modus ( b ). Er zijn eigenlijk nog veel meer modi beschikbaar en help(open)
zal u meer details over hen geven. Standaard beschouwt open() het ?le to
be a t ext ?le en opent het in de r ead-modus.
In ons voorbeeld openen we eerst het bestand in de modus tekst schrijven en gebruiken we het bestand schrijven
methode van het ?le-object om naar het ?le te schrijven en dan sluiten we uiteindelijk het ?le.
Het bovenstaande voorbeeld komt uit het boek “A Byte of Python” van Swaroop C H.
swaroopch.com