Czy to najczystszy sposób na napisanie listy do pliku, ponieważ writelines()
nie wstawia znaków nowego wiersza?
file.writelines(["%s\n" % item for item in list])
Wygląda na to, że istniałby standardowy sposób ...
Czy to najczystszy sposób na napisanie listy do pliku, ponieważ writelines()
nie wstawia znaków nowego wiersza?
file.writelines(["%s\n" % item for item in list])
Wygląda na to, że istniałby standardowy sposób ...
Odpowiedzi:
Możesz użyć pętli:
with open('your_file.txt', 'w') as f:
for item in my_list:
f.write("%s\n" % item)
W Pythonie 2 możesz także użyć
with open('your_file.txt', 'w') as f:
for item in my_list:
print >> f, item
Jeśli zależy Ci na pojedynczym wywołaniu funkcji, usuń przynajmniej nawiasy kwadratowe []
, aby napisy były drukowane pojedynczo (genexp zamiast listcomp) - nie ma powodu, aby zajmować całą wymaganą pamięć zmaterializować całą listę ciągów.
thefile.write('\n'.join(thelist))
thefile.write(str(item) + "\n")
Co zamierzasz zrobić z plikiem? Czy ten plik istnieje dla ludzi lub innych programów z wyraźnymi wymaganiami dotyczącymi interoperacyjności?
Jeśli próbujesz serializować listę na dysk w celu późniejszego wykorzystania przez tę samą aplikację w języku Python, powinieneś wybrać tę listę.
import pickle
with open('outfile', 'wb') as fp:
pickle.dump(itemlist, fp)
Aby przeczytać ponownie:
with open ('outfile', 'rb') as fp:
itemlist = pickle.load(fp)
open( "save.p", "wb" )
infile to coś w stylu:open( "save.p", "rb" )
with:
blok będzie zamknąć plik przed przejściem do następnego rachunku zewnątrz with
bloku.
Prostszym sposobem jest:
with open("outfile", "w") as outfile:
outfile.write("\n".join(itemlist))
Możesz upewnić się, że wszystkie elementy na liście pozycji są łańcuchami za pomocą wyrażenia generatora:
with open("outfile", "w") as outfile:
outfile.write("\n".join(str(item) for item in itemlist))
Pamiętaj, że wszystkie itemlist
listy muszą znajdować się w pamięci, więc zadbaj o zużycie pamięci.
Korzystanie ze składni Python 3 i Python 2.6+ :
with open(filepath, 'w') as file_handler:
for item in the_list:
file_handler.write("{}\n".format(item))
Jest to niezależne od platformy. Kończy także ostatnią linię znakiem nowej linii, co jest najlepszą praktyką w systemie UNIX .
Począwszy od Pythonie 3.6, "{}\n".format(item)
może być zastąpione przez f-wyrażenie: f"{item}\n"
.
file_handler.write("\n".join(str(item) for item in the_list))
Jeszcze inny sposób. Serializuj do json przy użyciu simplejson (dołączony jako json w Pythonie 2.6):
>>> import simplejson
>>> f = open('output.txt', 'w')
>>> simplejson.dump([1,2,3,4], f)
>>> f.close()
Jeśli przejrzysz plik output.txt:
[1, 2, 3, 4]
Jest to przydatne, ponieważ składnia jest pytoniczna, czytelna dla człowieka i może być odczytana przez inne programy w innych językach.
Pomyślałem, że interesujące byłoby zbadanie korzyści płynących z używania genexp, więc oto moje zdanie.
Przykład w pytaniu używa nawiasów kwadratowych do utworzenia listy tymczasowej, a więc jest równoważny z:
file.writelines( list( "%s\n" % item for item in list ) )
Co niepotrzebnie konstruuje tymczasową listę wszystkich wierszy, które zostaną wypisane, może to zużywać znaczną ilość pamięci w zależności od wielkości listy i tego, jak szczegółowe jest wyjście str(item)
.
Upuszczenie nawiasów kwadratowych (równoważne usunięciu list()
powyższego wywołania zawijania ) zamiast tego przekaże tymczasowy generator do file.writelines()
:
file.writelines( "%s\n" % item for item in list )
Ten generator utworzy item
na żądanie reprezentację twoich obiektów zakończoną znakiem nowej linii (tj. W miarę ich zapisywania). Jest to miłe z kilku powodów:
str(item)
jest wolny, widoczny jest postęp w pliku, gdy każdy element jest przetwarzanyPozwala to uniknąć problemów z pamięcią, takich jak:
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
(Wywołałem ten błąd, ograniczając maksymalną pamięć wirtualną Pythona do ~ 100 MB przy pomocy ulimit -v 102400
).
Odkładając zużycie pamięci na bok, ta metoda nie jest wcale szybsza niż oryginał:
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 w systemie Linux)
Ponieważ jestem leniwy ...
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())
with open ('Sp1.txt', 'a') as outfile:
json.dump (sp1_segments, outfile)
logger.info ("Saved sp_1 segments")
; Problemem jest to, że mój program uruchamia się trzykrotnie, a wyniki z trzech przebiegów są zbierane. czy jest jakiś sposób, aby dodać 1-2 puste wiersze, aby wyniki z każdego przebiegu były widoczne?
json.dump(sp1_segments + "\n\n", outfile)
?
Poniżej znajduje się składnia metody writelines ()
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()
file.write('\n'.join(list))
file
zmienną?
Możesz także użyć funkcji drukowania, jeśli korzystasz z Python3 w następujący sposób.
f = open("myfile.txt","wb")
print(mylist, file=f)
Ta logika najpierw przekształci elementy z listy na string(str)
. Czasami lista zawiera krotkę podobną do
alist = [(i12,tiger),
(113,lion)]
Ta logika zapisze w pliku każdą krotkę w nowej linii. Możemy później użyć eval
podczas ładowania każdej krotki podczas czytania pliku:
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
Jak to działa: Najpierw otwórz plik, korzystając z wbudowanej funkcji otwierania i określając nazwę pliku oraz tryb, w którym chcemy go otworzyć. Tryb może być trybem odczytu („r”), trybem zapisu („w”) lub trybem dołączania („a”). Możemy również określić, czy czytamy, piszemy, czy dołączamy w trybie tekstowym („t”) lub binarnym („b”). W rzeczywistości dostępnych jest wiele innych trybów, a pomoc (otwarta) da ci więcej szczegółów na ich temat. Domyślnie open () traktuje plik jako plik tekstowy „t” i otwiera go w trybie odczytu. W naszym przykładzie najpierw otwieramy plik w trybie zapisu tekstu i używamy metody write obiektu pliku do zapisu do pliku, a następnie zamykamy go.
Powyższy przykład pochodzi z książki „A Byte of Python” autorstwa Swaroop C. H. swaroopch.com
writelines
nie dodaje nowych wierszy, ponieważ odzwierciedlareadlines
, co również ich nie usuwa.