Pertanyaan Cara yang benar untuk menulis baris ke file?


Saya terbiasa melakukan print >>f, "hi there"

Namun, sepertinya begitu print >> semakin usang. Apa cara yang disarankan untuk melakukan baris di atas?

Memperbarui: Mengenai semua jawaban itu "\n"... apakah ini universal atau khusus Unix? IE, yang harus saya lakukan "\r\n" di Windows?


773
2018-05-28 05:44


asal


Jawaban:


Ini harus sesederhana:

with open('somefile.txt', 'a') as the_file:
    the_file.write('Hello\n')

Dari Dokumentasi:

Jangan gunakan os.linesep sebagai terminator garis saat menulis file dibuka dalam mode teks (default); gunakan satu '\ n' sebagai gantinya, di semua platform.

Beberapa bacaan bermanfaat:


694
2018-05-28 06:36



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 tidak membutuhkan import, sejak print() fungsi adalah default.

Alternatifnya adalah 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 Dokumentasi Python mengenai baris baru:

Pada output, jika baris baru Tidak ada, apapun '\n' karakter yang ditulis diterjemahkan ke pemisah baris default sistem, os.linesep. Jika baris baru '', tidak ada terjemahan yang terjadi. Jika baris baru adalah salah satu dari nilai hukum lainnya, apa pun '\n' karakter yang ditulis diterjemahkan ke string yang diberikan.


897
2018-05-28 05:48



Itu dokumen python merekomendasikan cara ini:

with open('file_to_write', 'w') as f:
    f.write('file contents')

Jadi ini adalah cara saya biasanya melakukannya :)

Pernyataan dari docs.python.org:

Ini adalah praktik yang baik untuk menggunakan 'dengan' kata kunci ketika berhadapan dengan file   objek. Ini memiliki keuntungan bahwa file ditutup dengan benar setelah   Rangkaiannya selesai, bahkan jika pengecualian muncul di jalan. ini   juga jauh lebih pendek daripada menulis blok try-finally yang setara.


91
2017-10-13 09:37



Mengenai os.linesep:

Berikut ini adalah sesi interpreter Python 2.7.1 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'
>>>

Di Windows:

Seperti yang diharapkan, os.linesep tidak TIDAK menghasilkan hasil yang sama dengan '\n'. Tidak mungkin itu bisa menghasilkan hasil yang sama. 'hi there' + os.linesep setara dengan 'hi there\r\n', yang mana TIDAK setara dengan 'hi there\n'.

Sesederhana ini: gunakan \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 menghasilkan hasil yang salah pada Windows.

JANGAN GUNAKAN os.linesep!


80
2018-05-29 03:02



Saya tidak berpikir ada cara yang "benar".

Saya akan menggunakan:

with open ('myfile', 'a') as f: f.write ('hi there\n')

Mengenang Tim Toady.


46
2018-05-28 05:48



Dalam Python 3 itu adalah fungsi, tetapi dengan Python 2 Anda dapat menambahkan ini ke bagian atas file sumber:

from __future__ import print_function

Maka Anda lakukan

print("hi there", file=f)

17
2018-05-28 05:49



Jika Anda menulis banyak data dan kecepatan adalah kekhawatiran Anda mungkin harus pergi dengan f.write(...). Saya melakukan perbandingan kecepatan cepat dan itu jauh lebih cepat daripada print(..., file=f) saat melakukan banyak penulisan.

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)

Rata-rata write selesai pada 2.45 di mesin saya, sedangkan print waktu sekitar 4 kali lebih lama (9,79 detik). Itu dikatakan, dalam kebanyakan skenario dunia nyata ini tidak akan menjadi masalah.

Jika Anda memilih untuk pergi bersama print(..., file=f) Anda mungkin akan menemukan bahwa Anda akan ingin menekan baris baru dari waktu ke waktu, atau menggantinya dengan yang lain. Ini bisa dilakukan dengan mengatur 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 saya sarankan menggunakan with karena itu membuat kode lebih mudah dibaca.

Memperbarui: Perbedaan dalam kinerja ini dijelaskan oleh fakta itu write sangat buffered dan mengembalikan sebelum menulis ke disk benar-benar terjadi (lihat jawaban ini), sedangkan print (mungkin) menggunakan line buffering. Tes sederhana untuk ini adalah memeriksa kinerja untuk penulisan panjang juga, di mana kerugian (dalam hal kecepatan) untuk line buffering akan kurang diucapkan.

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 kurang menonjol, dengan waktu rata-rata 2,20 detik write dan 3.10s untuk print. Jika Anda perlu menggabungkan banyak string untuk mendapatkan kinerja garis loooong ini akan menderita, jadi gunakan-kasus di mana print akan lebih efisien agak jarang.


14
2017-09-13 16:20



Ketika Anda mengatakan Baris itu berarti beberapa karakter serial yang diakhiri dengan karakter '\ n'. Baris harus berada di titik terakhir sehingga kami harus mempertimbangkan '\ n' di akhir setiap baris. Berikut ini solusinya:

with open('YOURFILE.txt', 'a') as the_file:
    the_file.write('Hello')

dalam mode tambahan setelah setiap menulis kursor pindah ke baris baru, jika Anda ingin menggunakan mode 'w' Anda harus menambahkan karakter '\ n' pada akhir fungsi tulis ():

the_file.write('Hello'+'\n')

5
2017-08-26 14:44