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?
Ini harus sederhana seperti:
with open('somefile.txt', 'a') as the_file:
the_file.write('Hello\n')
Dari Dokumentasi:
Jangan menggunakan
os.linesep
sebagai garis terminator saat menulis file dibuka dalam mode teks (default); penggunaan tunggal '\n' sebaliknya, pada semua platform.
Beberapa berguna membaca:
With
pernyataanopen()
os
(terutama os.linesep
)Anda harus menggunakan `print () fungsi yang tersedia sejak Python 2.6+
from __future__ import print_function # Only needed for Python 2
print("hi there", file=f)
Untuk Python 3 anda don't perlu impor
, karena cetak()
fungsi default.
Alternatif akan menggunakan:
f = open('myfile', 'w')
f.write('hi there\n') # python will convert \n to os.linesep
f.close() # you can omit in most cases as the destructor will call it
Mengutip dari Python dokumentasi mengenai baris baru:
Pada output, jika baris baru Ada, setiap
'\n'
karakter tertulis yang diterjemahkan ke sistem default garis pemisah,os.linesep
. Jika baris baru adalah''
, tidak ada terjemahan yang berlangsung. Jika baris baru yang lain nilai-nilai hukum, setiap'\n'
karakter tertulis yang diterjemahkan ke dalam string tertentu.
The python docs merekomendasikan cara ini:
with open('file_to_write', 'w') as f:
f.write('file contents')
Jadi ini adalah cara yang biasanya saya lakukan :)
Pernyataan dari docs.python.org:
Itu adalah praktik yang baik untuk menggunakan 'dengan' kata kunci ketika berhadapan dengan file benda-benda. Ini memiliki keuntungan bahwa file tersebut benar-benar ditutup setelah suite selesai, bahkan jika pengecualian yang dibesarkan di jalan. Hal ini juga jauh lebih pendek daripada menulis setara try-finally blok.
Mengenai os.linesep:
Berikut ini adalah aplikasi yang tepat diedit Python 2.7.1 penerjemah sesi pada Windows:
Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.linesep
'\r\n'
>>> f = open('myfile','w')
>>> f.write('hi there\n')
>>> f.write('hi there' + os.linesep) # same result as previous line ?????????
>>> f.close()
>>> open('myfile', 'rb').read()
'hi there\r\nhi there\r\r\n'
>>>
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!
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 daripada cetak(..., file=f)
ketika melakukan sejumlah besar menulis.
import time
start = start = time.time()
with open("test.txt", 'w') as f:
for i in range(10000000):
# print('This is a speed test', file=f)
# f.write('This is a speed test\n')
end = time.time()
print(end - start)
Pada rata-rata menulis
selesai di 2.45 s pada mesin saya, sedangkan print
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 opsional end
parameter, misalnya;
with open("test", 'w') as f:
print('Foo1,', file=f, end='')
print('Foo2,', file=f, end='')
print('Foo3', file=f)
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), sedangkan print
(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.
start = start = time.time()
long_line = 'This is a speed test' * 100
with open("test.txt", 'w') as f:
for i in range(1000000):
# print(long_line, file=f)
# f.write(long_line + '\n')
end = time.time()
print(end - start, "s")
Perbedaan kinerja sekarang menjadi jauh kurang jelas, dengan waktu rata-rata 2.20 s menulis
dan 3.10 s print
. Jika anda perlu untuk menggabungkan sekelompok string untuk mendapatkan ini loooong kinerja lini akan menderita, sehingga penggunaan-kasus di mana print
akan lebih efisien agak langka.
Sejak 3.5 anda juga dapat menggunakan [pathlib][1] untuk tujuan itu:
Path.write_text(data, pengkodean=Tidak ada, kesalahan=Tidak ada)
Buka file tersebut menunjuk ke dalam mode teks, menulis data ke dalamnya, dan tutup file tersebut:
import pathlib
pathlib.Path('textfile.txt').write_text('content')
[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:
with open('YOURFILE.txt', 'a') as the_file:
the_file.write('Hello')
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:
the_file.write('Hello'+'\n')
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:
out = open(file_name, 'w')
fwl = lambda *x, **y: print(*x, **y, file=out) # FileWriteLine
fwl('Hi')
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:
from functools import partial
fwl = partial(print, file=out)
IMHO, ini lebih fungsional dan kurang samar pendekatan.