Python 2.4'te dosyalar nasıl güvenle açılır / kapatılır


87

Şu anda sunucularımızdan birinde Python kullanarak kullanmak için küçük bir komut dosyası yazıyorum. Sunucuda yalnızca Python 2.4.4 kurulu.

Python'u 2.5 bitene kadar kullanmaya başlamadım, bu yüzden forma alıştım:

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

Ancak, with2.5'ten önceki bir ifade yoktur ve bir dosya nesnesini manuel olarak temizlemenin doğru yolu hakkında örnekler bulmakta güçlük çekiyorum.

Python'un eski sürümlerini kullanırken dosya nesnelerini güvenli bir şekilde atmak için en iyi uygulama nedir?

Yanıtlar:


140

Docs.python.org adresine bakın :

Bir dosyayla işiniz bittiğinde, onu kapatmak ve açık dosyanın kapladığı tüm sistem kaynaklarını boşaltmak için f.close () çağırın. F.close () çağrıldıktan sonra, dosya nesnesini kullanma girişimleri otomatik olarak başarısız olur.

Bu nedenle close()şunlarla zarif bir şekilde kullanın try/finally:

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

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

Bu # do stuff with f, bir istisna oluştursa bile f, yine de düzgün şekilde kapatılacağını garanti eder .

Not opengörünmelidir dışında bir try. Eğer openkendisi bir istisna yaratırsa, dosya açılmamıştır ve kapatılmasına gerek yoktur. Ayrıca, openbir özel durum onun sonucu olan değil atanmış fve çağrıya bir hatadır f.close().


Çok basit, teşekkürler. Nedense daha fazla bir şeye ihtiyacım olacağını bekliyordum.
TM.

16
Eğer openbaşarısız önce, bir özel duruma edilecek try/finallyblok bile girilir. Yani closeçağrılmayacak. (Bu yüzden openönce aramalısınız try.)
FogleBird

1
@TM openBir istisna oluşturmayla ilgili bir not ekledim .
Jon-Eric

4
Bu, with ifadesinin perde arkasına çevrildiği şeydir.
Arlaharen

1
Dosyayı açma, deneme içinde gerçekleşmelidir.
Anthony Rutledge

32

Yukarıdaki çözümde, burada tekrarlandı:

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

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

Dosyayı başarıyla açtıktan sonra ve denemeden önce kötü bir şey olursa (asla bilemezsiniz ...), dosya kapatılmaz, bu nedenle daha güvenli bir çözüm:

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

    # do stuff with f

finally:
    if f is not None:
       f.close()

With

@darkgaze with open(...), modern Python'da kesinlikle en iyi seçimdir.
mljrg

12

Aşağıdakilerle kullanıyorsanız, dosyayı belgelere göre kapatmanıza gerek yoktur:

Dosya nesneleriyle uğraşırken with anahtar sözcüğünü kullanmak iyi bir uygulamadır. Bu, yolda bir istisna ortaya çıksa bile, paketi bittikten sonra dosyanın düzgün şekilde kapatılması avantajına sahiptir. Aynı zamanda eşdeğer deneme blokları yazmaktan çok daha kısadır:

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

Daha fazla bilgi için: https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects


Bu hem doğru hem de soruya aldırış etmiyor.
Jon-Eric

-4

Burada, hangisinin nasıl kullanılacağı openve "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()

Dosyayı kaç kez açtığınızın bu kez kapatılması gerekir.


1
Sonrasında openancak öncesinde bir istisna ortaya çıkarsa close, dosya bu yaklaşım kullanılarak düzgün bir şekilde kapatılmaz. İstisnaların varlığında bile dosyayı düzgün kullanmak withveya try/ finallykapatır.
Jon-Eric
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.