Untuk operasi file, Python menggunakan buffering sistem operasi standar kecuali jika Anda mengkonfigurasinya, lakukan sebaliknya. Anda dapat menentukan ukuran buffer, tidak dibuat buffer, atau buffer baris.
Sebagai contoh, fungsi terbuka mengambil argumen ukuran buffer.
http://docs.python.org/library/functions.html#open
"Argumen buffering opsional menentukan ukuran buffer yang diinginkan file:"
- 0 berarti tidak terbaca,
- 1 berarti garis buffered,
- nilai positif lainnya berarti menggunakan buffer (kurang-lebih) ukuran itu.
- Buffer negatif berarti menggunakan default sistem, yang biasanya buffer baris untuk perangkat tty dan buffering penuh untuk file lain.
- Jika dihilangkan, standar sistem digunakan.
kode:
bufsize = 0
f = open('file.txt', 'w', buffering=bufsize)
open('file.txt', 'w', 1)
saya mendapatkan garis buffering yang tepat. Tetapi jika saya melakukan sesuatu yang lebih besar (saya inginopen('file.txt', 'w', 512)
) itu buffer penuhio.DEFAULT_BUFFER_SIZE
8192. Apakah itu bug Python, bug Linux, atau bug ID10t?stdout
menjadi buffer-line terlepas dari apakah itu konsol atau diarahkan ke file?write()
file handle, outputnya buffered di memori dan diakumulasikan hingga buffer penuh ... pada saat itu buffer "flushed" (konten ditulis dari buffer ke file). Anda dapat secara eksplisit membersihkan buffer dengan memanggilflush()
metode pada pegangan file.Anda juga dapat memaksa flush buffer ke file secara terprogram dengan
flush()
metode ini.Saya telah menemukan ini berguna ketika mengekor file keluaran dengan
tail -f
.sumber
Note: flush() does not necessarily write the file’s data to disk. Use flush() followed by os.fsync() to ensure this behavior.
Note: flush() does not necessarily write the file’s data to disk. Use flush() followed by os.fsync() to ensure this behavior.
flushing
. Mengapa kita membutuhkannya? Untuk apa ini? mengapa saya harus peduli?Saya tidak tahu apakah ini berlaku untuk python juga, tapi saya pikir itu tergantung pada sistem operasi yang Anda jalankan.
Di Linux misalnya, output ke terminal mem-flush buffer pada baris baru, sedangkan untuk output ke file hanya mem-flush ketika buffer penuh (secara default). Ini karena lebih efisien untuk menyiram buffer lebih sedikit, dan pengguna cenderung tidak memperhatikan jika output tidak memerah pada baris baru dalam file.
Anda mungkin dapat membersihkan secara otomatis output jika itu yang Anda butuhkan.
EDIT: Saya pikir Anda akan otomatis flush di python dengan cara ini (berdasarkan dari sini )
sumber
Anda juga dapat memeriksa ukuran buffer default dengan memanggil atribut DEFAULT_BUFFER_SIZE hanya baca dari modul io.
sumber
Berikut adalah pendekatan lain, hingga OP untuk memilih mana yang lebih disukai.
Ketika memasukkan kode di bawah ini dalam
__init__
file .py sebelum kode lain, pesan yang dicetak denganprint
dan kesalahan apa pun tidak akan lagi dicatat ke Ableton's Log.txt tetapi untuk memisahkan file pada disk Anda:(untuk Mac, ubah
#username#
nama folder pengguna Anda. Di Windows jalur ke folder pengguna Anda akan memiliki format yang berbeda)Ketika Anda membuka file dalam editor teks yang menyegarkan kontennya ketika file pada disk diubah (contoh untuk Mac: TextEdit tidak tetapi TextWrangler tidak), Anda akan melihat log diperbarui secara real-time.
Penghargaan: kode ini sebagian besar disalin dari skrip permukaan kontrol liveAPI oleh Nathan Ramella
sumber