Asta e cel mai curat mod de a scrie o listă într-un fișier, din writelines()
nu't a introduce caractere newline?
file.writelines(["%s\n" % item for item in list])
Se pare ca acolo ar fi o modalitate standard...
Puteți utiliza o buclă:
with open('your_file.txt', 'w') as f:
for item in my_list:
f.write("%s\n" % item)
În Python 2, puteți utiliza, de asemenea,
with open('your_file.txt', 'w') as f:
for item in my_list:
print >> f, item
Daca're pasionat pe un singur apel de funcție, cel puțin elimina paranteze drepte []
, astfel încât siruri de caractere pentru a fi tipărite se face unul la un moment dat (o genexp, mai degrabă decât un listcomp) -- nici un motiv să ia toate de memorie necesar să se materializeze întreaga listă de siruri de caractere.
Ce ai de gând să faci cu dosarul? - Acest fișier există pentru om, sau alte programe clare cu cerințele de interoperabilitate?
Dacă sunt doar încercarea de a serializa o listă a disk pentru o utilizare ulterioară de către același python app, ar trebui să fie pickleing lista.
import pickle
with open('outfile', 'wb') as fp:
pickle.dump(itemlist, fp)
Pentru a citi înapoi:
with open ('outfile', 'rb') as fp:
itemlist = pickle.load(fp)
Cel mai simplu mod este de:
lang-python outfile.scrie("\n".alăturați-vă(itemlist))
Ai putea asigura că toate elementele din listă sunt siruri de caractere folosind un generator de expresia:
lang-python outfile.scrie("\n".alăturați-vă(str(element) de element în itemlist))
Amintiți-vă că toate `itemlist lista trebuie să fie în memorie, astfel încât, să aibă grijă despre consumul de memorie.
Folosind Python 3 și Python 2.6+ sintaxa:
with open(filepath, 'w') as file_handler:
for item in the_list:
file_handler.write("{}\n".format(item))
Acest lucru este independent de platformă. Se încheie, de asemenea, linia de final cu un caracter newline, care este o UNIX cele mai bune practici.
Încă un alt mod. Serialize la json folosind simplejson (inclusă ca json în python 2.6):
>>> import simplejson
>>> f = open('output.txt', 'w')
>>> simplejson.dump([1,2,3,4], f)
>>> f.close()
Dacă examinăm output.txt:
[1, 2, 3, 4]
Acest lucru este util, deoarece sintaxa este pythonic, l's lizibil, și poate fi citit de către alte programe în alte limbi.
M-am gândit că ar fi interesant pentru a explora beneficiile de a utiliza o genexp, deci, aici's ia mea.
De exemplu, în cauză utilizează paranteze pătrate pentru a crea o listă temporară, și așa este echivalent cu:
file.writelines( list( "%s\n" % item for item in list ) )
Care în zadar construiește o listă temporară de toate liniile pe care va fi scris, acest lucru poate consuma cantități semnificative de memorie, în funcție de dimensiunea de listă și modul verbose ieșire din str(element)` este.
Drop paranteze pătrate (echivalent cu scoaterea de ambalaj lista()apelul de mai sus) va trece temporar [generator][1] la
fișier.writelines()`:
file.writelines( "%s\n" % item for item in list )
Acest generator va crea newline-a reziliat reprezentare de "articol" obiecte la cerere (de exemplu, ca ele sunt scrise). Acest lucru este frumos pentru un cuplu de motive:
str(element)
este lent, nu's progres vizibil în dosar, deoarece fiecare element este procesatAcest lucru evită probleme de memorie, cum ar fi:
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
(Am declanșat această eroare prin limitarea Python's max. memoria virtuală a ~100MB cu ulimit -v 102400`).
Pune memorie de utilizare într-o parte, această metodă este't de fapt mai repede decât originalul:
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 pe Linux)
Următoarele este sintaxa pentru writelines() metoda
fileObject.writelines( sequence )
#!/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()
Această logică va prima converti elementele din listă pentru a string(str)
. Uneori, lista conține un tuplu ca
alist = [(i12,tiger),
(113,lion)]
Această logică se va scrie în fișierul fiecare tuplu într-o nouă linie. Putem folosi mai târziu "eval" în timp ce de încărcare fiecare tuplu, atunci când citirea fișierului:
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
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
Cum Funcționează: În primul rând, deschideți un fișier prin utilizarea built-in funcția de deschis și specificând numele fișierului și modul în care ne-o dorim pentru a deschide fișierul. Modul poate fi un modul de citire ("r"), modul de scriere ("w") sau modul append ("a"). Putem specifica, de asemenea, dacă suntem citit, scris, sau adăugarea în modul text ("t") sau binar modul ("b"). De fapt sunt mult mai multe moduri disponibile și de a ajuta(deschis) va dau mai multe detalii despre ele. În mod implicit, deschis (a) consideră că dosarul fie o 't'ext fișierul și deschide-o în 'r' ead modul. În exemplul nostru, trebuie mai întâi să deschideți fișierul în scris modul text și de a folosi scrie metoda de fișier obiect pentru a scrie în fișier și apoi ne-am în cele din urmă închide dosarul.
Exemplul de mai sus este din cartea "a Byte of Python" de Swaroop C H. swaroopch.com