Apakah ini cara paling bersih untuk menulis daftar ke file, karena writelines()
tidak memasukkan karakter baris baru?
file.writelines(["%s\n" % item for item in list])
Sepertinya akan ada cara standar ...
Apakah ini cara paling bersih untuk menulis daftar ke file, karena writelines()
tidak memasukkan karakter baris baru?
file.writelines(["%s\n" % item for item in list])
Sepertinya akan ada cara standar ...
Jawaban:
Anda dapat menggunakan loop:
with open('your_file.txt', 'w') as f:
for item in my_list:
f.write("%s\n" % item)
Di Python 2, Anda juga bisa menggunakan
with open('your_file.txt', 'w') as f:
for item in my_list:
print >> f, item
Jika Anda tertarik pada panggilan fungsi tunggal, setidaknya hapus tanda kurung siku []
, sehingga string yang akan dicetak dibuat satu per satu (genexp daripada listcomp) - tidak ada alasan untuk mengambil semua memori yang diperlukan untuk mewujudkan seluruh daftar string.
thefile.write('\n'.join(thelist))
thefile.write(str(item) + "\n")
Apa yang akan kamu lakukan dengan file itu? Apakah file ini ada untuk manusia, atau program lain dengan persyaratan interoperabilitas yang jelas?
Jika Anda hanya mencoba membuat serial daftar untuk disk untuk digunakan nanti oleh aplikasi python yang sama, Anda harus memilih acar daftar.
import pickle
with open('outfile', 'wb') as fp:
pickle.dump(itemlist, fp)
Untuk membacanya kembali:
with open ('outfile', 'rb') as fp:
itemlist = pickle.load(fp)
open( "save.p", "wb" )
infile adalah sesuatu seperti:open( "save.p", "rb" )
with:
blok akan menutup file sebelum melanjutkan ke pernyataan luar berikutnya dari with
blok.
Cara yang lebih sederhana adalah:
with open("outfile", "w") as outfile:
outfile.write("\n".join(itemlist))
Anda dapat memastikan bahwa semua item dalam daftar item adalah string menggunakan ekspresi generator:
with open("outfile", "w") as outfile:
outfile.write("\n".join(str(item) for item in itemlist))
Ingat bahwa semua itemlist
daftar harus dalam memori, jadi, berhati-hatilah dengan konsumsi memori.
Menggunakan sintaks Python 3 dan Python 2.6+ :
with open(filepath, 'w') as file_handler:
for item in the_list:
file_handler.write("{}\n".format(item))
Ini adalah platform-independen. Ini juga mengakhiri baris terakhir dengan karakter baris baru, yang merupakan praktik terbaik UNIX .
Dimulai dengan Python 3.6, "{}\n".format(item)
bisa diganti dengan f-string: f"{item}\n"
.
file_handler.write("\n".join(str(item) for item in the_list))
Namun cara lain. Serialize to json menggunakan simplejson (termasuk json di python 2.6):
>>> import simplejson
>>> f = open('output.txt', 'w')
>>> simplejson.dump([1,2,3,4], f)
>>> f.close()
Jika Anda memeriksa output.txt:
[1, 2, 3, 4]
Ini berguna karena sintaksisnya adalah pythonic, dapat dibaca oleh manusia, dan dapat dibaca oleh program lain dalam bahasa lain.
Saya pikir akan menarik untuk mengeksplorasi manfaat menggunakan genexp, jadi inilah pendapat saya.
Contoh dalam pertanyaan menggunakan tanda kurung siku untuk membuat daftar sementara, dan itu sama dengan:
file.writelines( list( "%s\n" % item for item in list ) )
Yang tidak perlu membangun daftar sementara dari semua baris yang akan ditulis, ini dapat mengkonsumsi sejumlah besar memori tergantung pada ukuran daftar Anda dan bagaimana verbose output str(item)
adalah.
Jatuhkan tanda kurung (setara dengan menghapus list()
panggilan pembungkus di atas) sebagai gantinya akan meneruskan generator sementara ke file.writelines()
:
file.writelines( "%s\n" % item for item in list )
Generator ini akan membuat representasi item
objek Anda yang diakhiri baris baru sesuai permintaan (yaitu, saat dituliskan). Ini bagus karena beberapa alasan:
str(item)
lambat ada kemajuan yang terlihat dalam file karena setiap item diprosesIni menghindari masalah memori, seperti:
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
(Saya memicu kesalahan ini dengan membatasi memori virtual maksimum Python hingga ~ 100MB dengan ulimit -v 102400
).
Menempatkan penggunaan memori di satu sisi, metode ini sebenarnya tidak lebih cepat dari aslinya:
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 di Linux)
Karena aku malas ....
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")
; Masalahnya adalah program saya berjalan tiga kali, dan hasil dari tiga kali berjalan semakin dihaluskan. apakah ada cara untuk menambahkan 1-2 baris kosong sehingga hasil dari setiap proses dapat dilihat?
json.dump(sp1_segments + "\n\n", outfile)
?
Berikut ini adalah sintaks untuk metode 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
variabel?
Anda juga dapat menggunakan fungsi cetak jika Anda menggunakan python3 sebagai berikut.
f = open("myfile.txt","wb")
print(mylist, file=f)
Logika ini pertama-tama akan mengonversi item dalam daftar menjadi string(str)
. Terkadang daftar berisi tuple like
alist = [(i12,tiger),
(113,lion)]
Logika ini akan menulis untuk mengajukan setiap tuple di baris baru. Kita nanti dapat menggunakan eval
saat memuat setiap tuple saat membaca file:
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
Cara Bekerja: Pertama, buka fi le dengan menggunakan fungsi terbuka built-in dan tentukan nama fi le dan mode di mana kita ingin membuka fi le. Mode dapat berupa mode baca ('r'), mode tulis ('w') atau mode tambahkan ('a'). Kita juga dapat menentukan apakah kita membaca, menulis, atau menambahkan dalam mode teks ('t') atau mode biner ('b'). Sebenarnya ada lebih banyak mode yang tersedia dan bantuan (terbuka) akan memberi Anda lebih banyak detail tentangnya. Secara default, open () menganggap file tersebut sebagai file 't'ext dan membukanya dalam mode' r'ead. Dalam contoh kita, kita pertama-tama membuka fi le dalam mode teks tulis dan menggunakan metode tulis dari objek fi le untuk menulis ke fi le dan kemudian kita akhirnya menutup fi le.
Contoh di atas adalah dari buku "Byte of Python" oleh Swaroop C H. swaroopch.com
writelines
tidak menambahkan baris baru karena itu mirrorreadlines
, yang juga tidak menghapusnya.