Cara yang benar untuk menulis baris ke file?
I'm digunakan untuk melakukan cetak >>f, "hai"
Namun, tampaknya bahwa cetak >>
semakin usang. Apa adalah cara yang disarankan untuk melakukan baris di atas?
Update:
Mengenai semua jawaban-jawaban itu dengan "\n"
...ini universal atau Unix-spesifik? YAITU, aku harus melakukan "\r\n"
pada Windows?
972
12
Ini harus sederhana seperti:
Dari Dokumentasi:
Beberapa berguna membaca:
With
pernyataanopen()
os
(terutamaos.linesep
)Anda harus menggunakan `print () fungsi yang tersedia sejak Python 2.6+
Untuk Python 3 anda don't perlu
impor
, karenacetak()
fungsi default.Alternatif akan menggunakan:
Mengutip dari Python dokumentasi mengenai baris baru:
The python docs merekomendasikan cara ini:
Jadi ini adalah cara yang biasanya saya lakukan :)
Pernyataan dari docs.python.org:
Mengenai os.linesep:
Berikut ini adalah aplikasi yang tepat diedit Python 2.7.1 penerjemah sesi pada Windows:
Pada Windows:
Seperti yang diharapkan, os.linesep tidak TIDAK menghasilkan hasil yang sama sebagai
'\n'
. Tidak ada cara bahwa hal itu bisa menghasilkan hasil yang sama.'hi there' + os.linesep
setara dengan'hi there\r\n'
, yang TIDAK **** setara dengan'hi there\n'
.It's ini sederhana: gunakan
\n
yang akan diterjemahkan secara otomatis ke os.linesep. Dan itu's yang sederhana sejak pertama pelabuhan Python untuk Windows.Tidak ada gunanya menggunakan os.linesep non-Windows sistem, dan menghasilkan hasil yang salah pada Windows.
JANGAN MENGGUNAKAN os.linesep!
Saya tidak berpikir ada "benar" cara.
Saya akan menggunakan:
In memoriam Tim Toady.
Di Python 3 itu adalah sebuah fungsi, tetapi pada Python 2 anda dapat menambahkan ini ke atas dari file sumber:
Kemudian anda lakukan
Jika anda menulis banyak data dan kecepatan adalah kekhawatiran anda mungkin harus pergi dengan
f.menulis(...)
. Aku cepat perbandingan kecepatan dan itu jauh lebih cepat daripadacetak(..., file=f)
ketika melakukan sejumlah besar menulis.Pada rata-rata
menulis
selesai di 2.45 s pada mesin saya, sedangkanprint
butuh waktu sekitar 4 kali lebih lama (9.76 s). Bahwa menjadi kata, dalam kebanyakan skenario dunia nyata ini tidak akan menjadi masalah.Jika anda memilih untuk pergi dengan
cetak(..., file=f)
anda mungkin akan menemukan bahwa anda'll ingin menekan newline dari waktu ke waktu, atau menggantinya dengan sesuatu yang lain. Hal ini dapat dilakukan dengan pengaturan opsionalend
parameter, misalnya;Apapun cara yang anda pilih I'd sarankan menggunakan
dengan
karena itu membuat kode lebih mudah dibaca.Update: Ini perbedaan kinerja ini dijelaskan oleh fakta bahwa
menulis
adalah sangat buffered dan kembali sebelum menulis ke disk benar-benar terjadi (lihat jawaban ini), sedangkanprint
(mungkin) menggunakan line buffering. Sebuah tes sederhana untuk ini akan memeriksa kinerja untuk waktu yang lama menulis juga, di mana kerugian (dalam hal kecepatan) untuk baris penyangga akan menjadi kurang jelas.Perbedaan kinerja sekarang menjadi jauh kurang jelas, dengan waktu rata-rata 2.20 s
menulis
dan 3.10 sprint
. Jika anda perlu untuk menggabungkan sekelompok string untuk mendapatkan ini loooong kinerja lini akan menderita, sehingga penggunaan-kasus di manaprint
akan lebih efisien agak langka.Sejak 3.5 anda juga dapat menggunakan [pathlib][1] untuk tujuan itu:
[1]: https://docs.python.org/3/library/pathlib.html#pathlib.Path.write_text
Ketika anda mengatakan Jalur itu berarti beberapa serial karakter yang terakhir untuk '\n' karakter. Garis harus bertahan di beberapa titik sehingga kita harus mempertimbangkan '\n' di akhir setiap baris. Berikut ini adalah solusinya:
di append mode setelah masing-masing menulis kursor pindah ke baris baru, jika anda ingin menggunakan 'w' mode anda harus menambahkan '\n' karakter pada akhir write() fungsi:
Satu juga dapat menggunakan
io
modul seperti:Anda juga dapat mencoba
filewriter
pip menginstal filewriter
`` dari filewriter impor Penulis
Penulis(filename='my_file', ext='txt') << ["baris 1 hi ada", "baris 2"] `
Menulis menjadi
my_file.txt`Mengambil iterable atau objek dengan
__str__
dukungan.Ketika saya perlu menulis baris baru banyak, saya mendefinisikan sebuah lambda yang menggunakan
cetak
fungsi:Pendekatan ini memiliki manfaat yang dapat memanfaatkan semua fitur yang tersedia dengan
mencetak
fungsi.Update: Seperti yang disebutkan oleh Georgy di bagian komentar, itu adalah mungkin untuk meningkatkan ide ini lebih lanjut dengan
parsial
fungsi:IMHO, ini lebih fungsional dan kurang samar pendekatan.