Saya sudah terbiasa melakukannya print >>f, "hi there"
Namun, tampaknya print >>
sudah mulai ditinggalkan. Apa cara yang disarankan untuk melakukan baris di atas?
Pembaruan : Mengenai semua jawaban dengan "\n"
... apakah ini universal atau khusus-Unix? IE, yang harus saya lakukan "\r\n"
di Windows?
Jawaban:
Ini harus sesederhana:
Dari Dokumentasi:
Beberapa bacaan yang bermanfaat:
with
pernyataanopen()
os
(khususnyaos.linesep
)sumber
with
adalah cara yang lebih aman untuk mengingat untuk menutup file.the_file.close()
?Anda harus menggunakan
print()
fungsi yang tersedia sejak Python 2.6+Untuk Python 3 Anda tidak perlu
import
, karenaprint()
fungsinya adalah default.Alternatifnya adalah menggunakan:
Mengutip dari dokumentasi Python mengenai baris baru:
sumber
\n
" akan memerlukan newline = "" jika tidak Anda akan mendapatkan\r\r\n
Windows. Tidak ada alasan untuk lanjut dengan os.linesep sama sekali.\r\n
yang berisi\n
yang diterjemahkan ke os.linesep yang merupakan\r\n
hasil akhirnya\r\r\n
.open('myfile','a')
bukanopen('myfile','w')
?The docs python merekomendasikan cara ini:
Jadi begini biasanya saya melakukannya :)
Pernyataan dari docs.python.org :
sumber
with
dalam lingkaran. Itu membuat saya terus membuka dan menutup file saat saya melanjutkan di loop saya. Mungkin saya kehilangan sesuatu di sini, atau ini benar-benar merugikan dalam skenario khusus ini?Mengenai os.linesep:
Berikut ini adalah sesi juru bahasa Python 2.7.1 yang belum diedit pada Windows:
Di Windows:
Seperti yang diharapkan, os.linesep TIDAK menghasilkan hasil yang sama seperti
'\n'
. Tidak ada cara yang bisa menghasilkan hasil yang sama.'hi there' + os.linesep
setara dengan'hi there\r\n'
, yang TIDAK setara dengan'hi there\n'
.Ini sederhana: penggunaan
\n
yang akan diterjemahkan secara otomatis ke os.linesep. Dan sudah semudah itu sejak port pertama Python ke Windows.Tidak ada gunanya menggunakan os.linesep pada sistem non-Windows, dan itu menghasilkan hasil yang salah pada Windows.
JANGAN GUNAKAN os.linesep!
sumber
os.linesep
Windows dalam mode teks, hasilnya adalah\r\r\n
yang salah. "Windows menggunakan ..." tidak ada artinya. Pustaka runtime C (dan karenanya Python) menerjemahkan\n
ke\r\n
pada output dalam mode teks. Perangkat lunak lain mungkin berperilaku berbeda. BUKAN semua perangkat lunak yang berjalan di Windows mengenali satu-satunya\n
sebagai pemisah garis saat membaca dalam mode teks. Python melakukannya. Editor teks Notepad Microsoft tidak.\r
...os.linesep
adalah "salah" di sini. Itu sepertiDepartment of Redundancy Department
. Ya kamu bisa melakukannya. Tidak, kamu tidak mau.Saya tidak berpikir ada cara yang "benar".
Saya akan menggunakan:
In Memoriam Tim Toady .
sumber
with
keluar dari ruang lingkup.open(..., 'a')
atau bahkan'at'
.Dalam Python 3 itu adalah fungsi, tetapi dalam Python 2 Anda dapat menambahkan ini ke bagian atas file sumber:
Lalu kamu lakukan
sumber
Jika Anda menulis banyak data dan kecepatan adalah masalah yang mungkin harus Anda lakukan
f.write(...)
. Saya melakukan perbandingan kecepatan cepat dan itu jauh lebih cepat daripadaprint(..., file=f)
ketika melakukan banyak menulis.Rata
write
- rata selesai dalam 2,45 detik pada mesin saya, sedangkanprint
waktu sekitar 4 kali lebih lama (9,76 detik). Yang sedang berkata, dalam sebagian besar skenario dunia nyata ini tidak akan menjadi masalah.Jika Anda memilih untuk pergi dengan
print(..., file=f)
Anda, Anda mungkin akan ingin menekan baris baru dari waktu ke waktu, atau menggantinya dengan yang lain. Ini dapat dilakukan dengan mengaturend
parameter opsional , misalnya;Apa pun cara yang Anda pilih, saya sarankan menggunakan
with
karena membuat kode lebih mudah dibaca.Pembaruan : Perbedaan dalam kinerja ini dijelaskan oleh fakta bahwa
write
sangat buffered dan kembali sebelum menulis ke disk benar-benar terjadi (lihat jawaban ini ), sedangkanprint
(mungkin) menggunakan buffering garis. Tes sederhana untuk ini adalah untuk memeriksa kinerja untuk penulisan yang lama juga, di mana kelemahan (dalam hal kecepatan) untuk buffering garis akan kurang jelas.Perbedaan kinerja sekarang menjadi jauh lebih sedikit diucapkan, dengan waktu rata-rata 2,20 untuk
write
dan 3,10 untukprint
. Jika Anda perlu menyatukan banyak string untuk mendapatkan kinerja garis loooong ini akan menderita, jadi kasus penggunaan di manaprint
akan lebih efisien agak jarang.sumber
Sejak 3,5 Anda juga dapat menggunakan
pathlib
untuk tujuan itu:sumber
Ketika Anda mengatakan Baris, itu berarti beberapa karakter serial yang diakhiri dengan karakter '\ n'. Baris harus terakhir di beberapa titik jadi kita harus mempertimbangkan '\ n' di akhir setiap baris. Ini solusinya:
dalam mode tambahkan setelah setiap tuliskan kursor pindah ke baris baru, jika Anda ingin menggunakan
w
mode Anda harus menambahkan\n
karakter di akhirwrite()
fungsi:sumber
Seseorang juga dapat menggunakan
io
modul seperti pada:sumber
Untuk menulis teks dalam file dalam termos dapat digunakan:
sumber
Anda juga bisa mencoba
filewriter
pip install filewriter
Menulis ke dalam
my_file.txt
Mengambil iterable atau objek dengan
__str__
dukungan.sumber
Ketika saya harus menulis banyak baris baru, saya mendefinisikan lambda yang menggunakan
print
fungsi:Pendekatan ini memiliki manfaat yaitu dapat memanfaatkan semua fitur yang tersedia dengan
print
fungsi tersebut.Pembaruan: Seperti yang disebutkan oleh Georgy di bagian komentar, adalah mungkin untuk meningkatkan ide ini lebih jauh dengan
partial
fungsi:IMHO, ini adalah pendekatan yang lebih fungsional dan kurang samar.
sumber
from functools import partial; fwl = partial(print, file=out)
.