Cara membuka / menutup file dengan aman di python 2.4

87

Saat ini saya sedang menulis skrip kecil untuk digunakan di salah satu server kami menggunakan Python. Server hanya menginstal Python 2.4.4.

Saya tidak mulai menggunakan Python sampai 2.5 keluar, jadi saya terbiasa dengan formulir:

with open('file.txt', 'r') as f:
    # do stuff with f

Namun, tidak ada withpernyataan sebelum 2.5, dan saya kesulitan menemukan contoh tentang cara yang tepat untuk membersihkan objek file secara manual.

Apa praktik terbaik untuk membuang objek file dengan aman saat menggunakan python versi lama?

TM.
sumber

Jawaban:

140

Lihat docs.python.org :

Ketika Anda selesai dengan sebuah file, panggil f.close () untuk menutupnya dan membebaskan semua sumber daya sistem yang diambil oleh file yang terbuka. Setelah memanggil f.close (), upaya untuk menggunakan objek file akan gagal secara otomatis.

Karenanya gunakan close()dengan elegan dengan try/finally:

f = open('file.txt', 'r')

try:
    # do stuff with f
finally:
    f.close()

Ini memastikan bahwa meskipun # do stuff with fmemunculkan pengecualian, fakan tetap ditutup dengan benar.

Perhatikan bahwa openakan muncul di luar dari try. Jika openmemunculkan pengecualian, file tidak dibuka dan tidak perlu ditutup. Juga, jika openmemunculkan pengecualian, hasilnya tidak ditetapkan fdan merupakan kesalahan untuk dipanggil f.close().

Jon-Eric
sumber
Sangat sederhana, terima kasih. Untuk beberapa alasan saya berharap bahwa saya membutuhkan sesuatu yang lebih terlibat.
TM.
16
Jika opengagal, pengecualian akan dimunculkan bahkan sebelum try/finallyblok dimasukkan. Jadi closetidak akan dipanggil. (Itulah mengapa Anda harus menelepon opensebelum try.)
FogleBird
1
@ TM Saya menambahkan catatan tentang openmengajukan pengecualian.
Jon-Eric
4
Inilah yang diterjemahkan oleh pernyataan with di balik layar.
Arlaharen
1
Membuka file harus dilakukan dalam percobaan.
Anthony Rutledge
32

Dalam solusi di atas, diulangi di sini:

f = open('file.txt', 'r')

try:
    # do stuff with f
finally:
   f.close()

jika terjadi sesuatu yang buruk (Anda tidak pernah tahu ...) setelah membuka file dengan sukses dan sebelum mencoba, file tidak akan ditutup, jadi solusi yang lebih aman adalah:

f = None
try:
    f = open('file.txt', 'r')

    # do stuff with f

finally:
    if f is not None:
       f.close()
mljrg.dll
sumber
Menggunakan pernyataan with open (...), tidak peduli bagaimana blok with diselesaikan (bahkan dengan pengecualian) file ditutup
darkgaze
@darkgaze with open(...)jelas merupakan pilihan terbaik dengan Python modern.
mljrg
12

Tidak perlu menutup file sesuai dengan dokumen jika Anda menggunakan dengan:

Ini adalah praktik yang baik untuk menggunakan kata kunci with saat menangani objek file. Ini memiliki keuntungan bahwa file ditutup dengan benar setelah rangkaiannya selesai, bahkan jika pengecualian dimunculkan dalam perjalanan. Ini juga jauh lebih pendek daripada menulis blok coba-akhirnya yang setara:

>>> with open('workfile', 'r') as f:
...     read_data = f.read()
>>> f.closed
True

Selengkapnya di sini: https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects

pengguna3765030
sumber
Ini benar dan mengabaikan pertanyaan itu.
Jon-Eric
-4

Berikut adalah contoh yang diberikan bagaimana menggunakan opendan "pythonclose

from sys import argv
script,filename=argv
txt=open(filename)
print "filename %r" %(filename)
print txt.read()
txt.close()
print "Change the file name"
file_again=raw_input('>')
print "New file name %r" %(file_again)
txt_again=open(file_again)
print txt_again.read()
txt_again.close()

Perlu berapa kali Anda membuka file harus menutup waktu itu.

Varun Chhangani
sumber
1
Jika pengecualian dimunculkan setelah opentetapi sebelumnya close, file tidak akan ditutup dengan benar menggunakan pendekatan ini. Menggunakan withatau try/ finallymenutup file dengan benar meskipun terdapat pengecualian.
Jon-Eric