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?

Mengomentari pertanyaan (3)
Larutan

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:

Komentar (10)

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.

Komentar (18)

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.

Komentar (3)

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!

Komentar (7)

Saya tidak berpikir ada "benar" cara.

Saya akan menggunakan:

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

In memoriam Tim Toady.

Komentar (7)

Di Python 3 itu adalah sebuah fungsi, tetapi pada Python 2 anda dapat menambahkan ini ke atas dari file sumber:

from __future__ import print_function

Kemudian anda lakukan

print("hi there", file=f)
Komentar (0)

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.

Komentar (0)

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

Komentar (0)

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')
Komentar (1)

Satu juga dapat menggunakan io modul seperti:

import io
my_string = "hi there"

with io.open("output_file.txt", mode='w', encoding='utf-8') as f:
    f.write(my_string)
Komentar (0)

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 menjadimy_file.txt`

Mengambil iterable atau objek dengan __str__ dukungan.

Komentar (0)

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.

Komentar (3)