Kapan file ditutup?
Seperti yang dapat kita pelajari dari Apakah secara eksplisit menutup file penting? (StackOverflow) , interpreter Python menutup file dalam kasus berikut:
- Anda secara manual memanggil
close()
metode file
objek secara eksplisit atau implisit dengan meninggalkan with open(...):
blok. Ini berfungsi tentu saja selalu dan pada setiap implementasi Python.
- yang
file
referensi terakhir objek mendapat dihapus dan karena itu objek akan diproses oleh Kolektor Sampah. Ini bukan fitur bahasa, tetapi fitur khusus dari implementasi CPython saja, jadi untuk portabilitas jangan mengandalkan ini!
- interpreter Python berakhir. Dalam hal ini harus menutup semua pegangan file yang dibuka. Beberapa versi Python3 lama juga akan mencetak peringatan bahwa Anda harus menutupnya sendiri secara manual. Namun, bayangkan crash atau Anda membunuh interpreter Python secara paksa dan Anda akan melihat bahwa ini juga tidak dapat diandalkan.
Jadi hanya metode (manual) pertama yang dapat diandalkan!
Apa yang akan terjadi jika file tetap terbuka?
Pertama, tergantung pada implementasi interpreter Python Anda, jika Anda membuka file dengan akses tulis, Anda tidak dapat memastikan bahwa modifikasi Anda mem-flush ke disk sampai Anda menginduksi secara manual atau file handler ditutup.
Kedua, Anda hanya dapat membuka sejumlah file pada sistem Anda per pengguna. Jika Anda melebihi batas ini dengan misalnya membuka banyak file dalam satu loop dalam program Python Anda tanpa menutupnya sesegera mungkin, sistem mungkin menolak untuk membuka file menangani lebih lanjut untuk Anda dan Anda akan menerima pengecualian. Mungkin juga terjadi bahwa program Anda mengambil file terbuka terakhir yang diizinkan dan program lain akan gagal karena ditolak.
Ketiga, membuka file pada perangkat yang dapat dilepas mencegahnya tidak di-mount atau dikeluarkan. Anda masih dapat menghapus file pada beberapa sistem file seperti ext4
, di mana hanya deskriptor file / tautan keras ke inode file akan dihapus / tidak ditautkan tetapi program yang membuka file masih dapat mengakses inode melalui file handler temporernya sendiri. Ini juga merupakan mekanisme yang memungkinkan Anda memperbarui paket ketika perangkat lunak masing-masing berjalan. Namun, misalnya NTFS tidak memiliki fitur seperti itu. Namun mungkin tidak pernah dimodifikasi oleh dua proses bersamaan, sehingga entah bagaimana akan tetap diblokir untuk orang lain.
with open (file_name, ...) as variable:
secara otomatis memanggilclose()
metode segera setelah Anda meninggalkan blok kode ini.