Jadi saya belajar Python. Saya menjalani pelajaran dan mengalami masalah di mana saya harus menyingkat banyak sekali target.write()
menjadi satu write()
, sementara memiliki "\n"
antara setiap variabel input pengguna (objek dari write()
).
Saya datang dengan:
nl = "\n"
lines = line1, nl, line2, nl, line3, nl
textdoc.writelines(lines)
Jika saya mencoba melakukan:
textdoc.write(lines)
Saya mendapatkan kesalahan. Tetapi jika saya mengetik:
textdoc.write(line1 + "\n" + line2 + ....)
Maka itu bekerja dengan baik. Mengapa saya tidak dapat menggunakan string untuk baris baru di write()
tetapi saya dapat menggunakannya di writelines()
?
Python 2.7 Ketika saya mencari di Google, sebagian besar sumber daya yang saya temukan jauh melampaui kepala saya, saya masih orang awam.
python
string
file-io
python-2.x
AbeLinkon
sumber
sumber
lines
bukan string dalam contoh Anda. Ini adalah tupel yang terdiri dari enam senar.Jawaban:
writelines
mengharapkan string yang dapat diulangwrite
mengharapkan satu string.line1 + "\n" + line2
menggabungkan string tersebut menjadi satu string sebelum meneruskannya kewrite
.Perhatikan bahwa jika Anda memiliki banyak baris, Anda mungkin ingin menggunakan
"\n".join(list_of_lines)
.sumber
writelines
mengharapkan iterable. Anda dapat menggunakan list, tuple, atau generator.write
bukanwritelines
jika Anda memiliki banyak baris? Writelines bisa berkinerja lebih baik karena tidak harus membuat string gabungan sementara, hanya melakukan iterasi di atas garis.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 menggunakanwritelines()
.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 disebutwrite_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:
Ini menangani penutupan file untuk Anda. Konstruksi
'\n'.join(lines)
menggabungkan (menghubungkan) string dalam daftarlines
dan menggunakan karakter '\ n' sebagai perekat. Ini lebih efisien daripada menggunakan+
operator.Mulai dari
lines
urutan yang sama , berakhir dengan keluaran yang sama, tetapi menggunakanwritelines()
: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 sudahreadlines()
ada sebelumwritelines()
diperkenalkan.writelines()
diperkenalkan nanti sebagai bagian darireadlines()
, sehingga orang dapat dengan mudah menulis konten file yang baru saja dibaca melaluireadlines()
: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 sebelumwritelines()
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: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).
sumber
write()
danwritelines()
pada dasarnya setara dan penggunaannya juga merupakan masalah selera pribadi. Namun, penting untuk dicatat bahwa untuk daftar string yang sangat panjang (disebutlines
) kurang efisien untuk menulisf.write('\n'.join(lines))
daripadafor l in line: f.write('%s\n' % l)
. Dalam kasus pertama, string yang sangat baru dan sangat panjang dibuat dalam memori sebelum menulisnya. Dalam kasus kedua, data ditulis sepotong demi sepotong.outf.writelines(inf.readlines())
melainkanoutf.writelines(inf)
. Fungsi yang tidak ingin kita gunakan lagireadlines()
tidakwritelines()
.writelines()
, semantiknya, seperti yang dijelaskan, kurang dari ideal. Inilah mengapa saya tidak pernah menggunakannya. Dan saya tidak pernah melewatkannya.jika Anda hanya ingin menyimpan dan memuat daftar coba Pickle
Penghematan acar:
dan memuat:
sumber
Sebenarnya, menurut saya masalahnya adalah variabel "baris" Anda buruk. Anda mendefinisikan baris sebagai tupel, tetapi saya percaya write () membutuhkan string. Yang harus Anda ubah hanyalah koma Anda menjadi plus (+).
harus bekerja.
sumber
Latihan 16 dari buku Zed Shaw? Anda dapat menggunakan karakter escape sebagai berikut:
sumber
" \n ".join((line1, line2, line3))
.