Mengapa saya tidak dapat menggunakan string untuk baris baru di write () tetapi saya dapat menggunakannya di writelines ()?
Idenya adalah sebagai berikut: jika Anda ingin menulis satu string, Anda dapat melakukannya dengan write()
. Jika Anda memiliki rangkaian string, Anda dapat menulis semuanya menggunakan writelines()
.
write(arg)
mengharapkan string sebagai argumen dan menulisnya ke file. Jika Anda memberikan daftar string, itu akan memunculkan pengecualian (omong-omong, tunjukkan kesalahan kepada kami!).
writelines(arg)
mengharapkan iterable sebagai argumen (objek yang dapat diulang dapat berupa tupel, daftar, string, atau iterator dalam pengertian yang paling umum). Setiap item yang terdapat dalam iterator diharapkan menjadi string. Tuple string adalah apa yang Anda berikan, sehingga semuanya berfungsi.
Sifat string tidak menjadi masalah bagi kedua fungsi tersebut, yaitu mereka hanya menulis ke file apa pun yang Anda berikan. Bagian yang menarik adalah writelines()
tidak menambahkan karakter baris baru sendiri, sehingga nama metode sebenarnya bisa sangat membingungkan. Ini sebenarnya berperilaku seperti metode imajiner yang disebut write_all_of_these_strings(sequence)
.
Berikut ini adalah cara idiomatik di Python untuk menulis daftar string ke file sambil menjaga setiap string di barisnya sendiri:
lines = ['line1', 'line2']
with open('filename.txt', 'w') as f:
f.write('\n'.join(lines))
Ini menangani penutupan file untuk Anda. Konstruksi '\n'.join(lines)
menggabungkan (menghubungkan) string dalam daftar lines
dan menggunakan karakter '\ n' sebagai perekat. Ini lebih efisien daripada menggunakan +
operator.
Mulai dari lines
urutan yang sama , berakhir dengan keluaran yang sama, tetapi menggunakan writelines()
:
lines = ['line1', 'line2']
with open('filename.txt', 'w') as f:
f.writelines("%s\n" % l for l in lines)
Ini menggunakan ekspresi generator dan secara dinamis membuat string baru yang diakhiri baris. writelines()
mengulangi urutan string ini dan menulis setiap item.
Sunting: Hal lain yang harus Anda perhatikan:
write()
dan sudah readlines()
ada sebelum writelines()
diperkenalkan. writelines()
diperkenalkan nanti sebagai bagian dari readlines()
, sehingga orang dapat dengan mudah menulis konten file yang baru saja dibaca melalui readlines()
:
outfile.writelines(infile.readlines())
Sungguh, inilah alasan utama mengapa writelines
memiliki nama yang membingungkan. Juga, hari ini, kami tidak benar-benar ingin menggunakan metode ini lagi. readlines()
membaca seluruh file ke memori mesin Anda sebelum writelines()
mulai menulis data. Pertama-tama, ini mungkin membuang waktu. Mengapa tidak mulai menulis bagian data sambil membaca bagian lain? Namun, yang terpenting, pendekatan ini bisa sangat memakan memori. Dalam skenario ekstrim, di mana file input lebih besar dari memori mesin Anda, pendekatan ini bahkan tidak akan berfungsi. Solusi untuk masalah ini adalah dengan menggunakan iterator saja. Contoh kerja:
with open('inputfile') as infile:
with open('outputfile') as outfile:
for line in infile:
outfile.write(line)
Ini membaca file input baris demi baris. Segera setelah satu baris dibaca, baris ini ditulis ke file keluaran. Diucapkan secara skematis, selalu hanya ada satu baris dalam memori (dibandingkan dengan seluruh konten file yang ada di memori dalam kasus pendekatan garis baca / garis tulis).
lines
bukan string dalam contoh Anda. Ini adalah tupel yang terdiri dari enam senar.