Pertanyaan Python - write () versus writelines () dan string yang digabung


Jadi saya belajar Python. Saya menjalani pelajaran dan mengalami masalah di mana saya harus memadatkan banyak orang target.write() menjadi satu write(), saat 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 coba lakukan:

textdoc.write(lines)

Saya mendapat kesalahan. Tetapi jika saya mengetik:

textdoc.write(line1 + "\n" + line2 + ....)

Maka itu berfungsi dengan baik. Mengapa saya tidak dapat menggunakan string untuk baris baru di write() tapi saya bisa menggunakannya writelines()?

Python 2.7 Ketika saya mencari sumber daya yang paling saya temukan di Google, saya masih awam.


76
2017-09-11 20:31


asal


Jawaban:


writelines mengharapkan daftar string, sementara write mengharapkan satu string.

line1 + "\n" + line2 menggabungkan string-string itu menjadi satu string sebelum meneruskannya write.

Perhatikan bahwa jika Anda memiliki banyak baris, Anda mungkin ingin menggunakannya "\n".join(list_of_lines).


92
2017-09-11 20:36



Mengapa saya tidak dapat menggunakan string untuk baris baru dalam menulis () tetapi saya dapat menggunakannya dalam penulisan ()?

Idenya adalah sebagai berikut: jika Anda ingin menulis string tunggal, Anda dapat melakukan ini 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 meningkatkan pengecualian (by the way, tampilkan kesalahan kepada kami!).

writelines(arg) mengharapkan sebuah iterable sebagai argumen (objek yang dapat diulang dapat berupa tuple, daftar, string, atau iterator dalam pengertian yang paling umum). Setiap item yang terkandung dalam iterator diharapkan menjadi string. Satu senar string adalah apa yang Anda berikan, sehingga semuanya berjalan lancar.

Sifat string (s) tidak masalah untuk kedua fungsi, yaitu mereka hanya menulis ke file apa pun yang Anda berikan kepada mereka. Bagian yang menarik adalah itu writelines() tidak menambahkan karakter baris baru sendiri, jadi nama metode sebenarnya bisa sangat membingungkan. Itu sebenarnya berperilaku seperti metode imajiner yang disebut write_all_of_these_strings(sequence).

Apa yang berikut adalah cara idiomatik dalam 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. Konstruk '\n'.join(lines) menggabungkan (menghubungkan) string dalam daftar lines dan menggunakan karakter '\ n' sebagai lem. Ini lebih efisien daripada menggunakan + operator.

Mulai dari yang sama lines urutan, berakhir dengan output 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 yang diakhiri newline. writelines() iterates atas urutan string dan menulis setiap item.

Edit: Hal lain yang harus Anda ketahui:

write() dan readlines() sudah ada sebelumnya writelines() diperkenalkan. writelines() diperkenalkan kemudian sebagai mitra dari readlines(), sehingga seseorang dapat dengan mudah menulis konten file yang baru saja dibaca via readlines():

outfile.writelines(infile.readlines())

Sungguh, ini adalah alasan utama mengapa writelines memiliki nama yang membingungkan. Juga, hari ini, kita tidak benar-benar ingin menggunakan metode ini lagi. readlines() membaca seluruh file ke memori komputer Anda sebelumnya writelines() mulai menulis data. Pertama-tama, ini mungkin membuang waktu. Mengapa tidak mulai menulis bagian-bagian data sambil membaca bagian lain? Tapi, yang paling penting, pendekatan ini bisa sangat memakan memori. Dalam skenario ekstrim, di mana file input lebih besar dari memori komputer Anda, pendekatan ini bahkan tidak akan berfungsi. Solusi untuk masalah ini adalah 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 output. Dituturkan secara skematis, selalu hanya ada satu baris tunggal dalam memori (dibandingkan dengan seluruh konten file yang berada di memori dalam hal pendekatan readlines / writelines).


90
2017-09-11 20:40



Sebenarnya, saya pikir masalahnya adalah bahwa "garis" variabel Anda buruk. Anda mendefinisikan garis sebagai tupel, tetapi saya percaya bahwa menulis () membutuhkan string. Yang harus Anda ubah hanyalah koma Anda menjadi plus (+).

nl = "\n"
lines = line1+nl+line2+nl+line3+nl
textdoc.writelines(lines)

harus bekerja.


-2
2017-09-17 22:18



jika Anda hanya ingin menyimpan dan memuat daftar coba Acar

Acar acar:

with open("yourFile","wb")as file:
 pickle.dump(YourList,file)

dan memuat:

with open("yourFile","rb")as file:
 YourList=pickle.load(file)

-2
2018-03-11 15:29



Latihan 16 dari buku Zed Shaw? Anda dapat menggunakan karakter pelolosan sebagai berikut:

paragraph1 = "%s \n %s \n %s \n" % (line1, line2, line3)
target.write(paragraph1)
target.close()

-2
2018-02-06 07:30