Apakah menutup file setelah membukanya dengan `open ()` diperlukan dengan Python? [Tutup]

9

Mengenai pertanyaan saya sebelumnya , saya perhatikan bahwa dalam kedua jawaban yang menggunakan open()fungsi tersebut, tidak disebutkan untuk menutup file.

Saya sudah membaca bahwa itu praktik yang baik untuk melakukannya, tetapi apakah sebenarnya ada kebutuhan untuk itu? Apakah itu hanya kode yang tidak perlu?

Apakah file ditutup secara otomatis?

TellMeWhy
sumber
1
with open (file_name, ...) as variable:secara otomatis memanggil close()metode segera setelah Anda meninggalkan blok kode ini.
Byte Commander
1
Duplikat lintas-situs stackoverflow.com/q/7395542/4464570
Byte Commander
@ByteCommander Anda ingin memberikan komentar sebagai jawaban, agar pertanyaan ini 'terpecahkan'?
TellMeWhy
1
Di python3, file tersebut dibatalkan secara otomatis setelah tidak memiliki referensi lagi.
Jacob Vlijm
4
Saya memberikan suara untuk menutup pertanyaan ini sebagai di luar topik karena ini adalah pertanyaan umum tentang Python tanpa koneksi ke skrip di Ubuntu. ia bertanya tentang praktik terbaik dalam bahasa pemrograman.
terdon

Jawaban:

9

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 fileobjek secara eksplisit atau implisit dengan meninggalkan with open(...):blok. Ini berfungsi tentu saja selalu dan pada setiap implementasi Python.
  • yang filereferensi 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.

Komandan Byte
sumber
Tidak sepenuhnya benar untuk python3 !!
Jacob Vlijm
@ JacobVlijm Maukah Anda menjelaskannya?
Byte Commander
Lihat komentar di bawah pertanyaan. Jawaban tentang "bukan praktik yang baik" di tautan jawaban Anda adalah dari 2011. Jika pernah ada, peringatan di python3tidak ada lagi dan jawabannya sudah usang. Pengumpulan sampah otomatis ada karena suatu alasan dan berfungsi dengan sempurna. Sudah bertahun-tahun sejak saya menggunakan close()secara khusus. Tidak pernah mengalami kesalahan tunggal yang disebabkan oleh tidak menggunakannya.
Jacob Vlijm
Soo ... Anda tahu apakah implementasi lain seperti PyPy, Jython atau IronPython menutup file dengan cara yang sama seperti CPython? Dan jika saya membunuh penerjemah, itu tidak akan memiliki kesempatan untuk menutup file, kan? Dan saya juga berpikir bahwa batas file terbuka masih berlaku. Bagaimana dengan pembilasan data tertulis? Anda tahu ada yang lebih baru di sana?
Byte Commander
1
@JacobVlijm Terima kasih atas tipnya. : P Mesin saya sudah mogok saat membuat file itu ... Saya bahkan tidak perlu Python untuk itu.
Byte Commander