2010-09-22 31 views
71

Tôi hiện đang viết một tập lệnh nhỏ để sử dụng trên một trong các máy chủ của chúng tôi bằng cách sử dụng Python. Máy chủ chỉ cài đặt Python 2.4.4.Cách mở/đóng tệp an toàn trong python 2.4

tôi không bắt đầu sử dụng Python cho đến 2.5 đã được ra khỏi, vì vậy tôi sử dụng để có dạng:

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

Tuy nhiên, không có with tuyên bố trước 2.5, và tôi gặp khó khăn trong việc tìm kiếm các ví dụ về cách thích hợp để dọn dẹp một đối tượng tệp theo cách thủ công.

Cách tốt nhất để xử lý các đối tượng tệp một cách an toàn khi sử dụng phiên bản python cũ là gì?

Trả lời

116

Sử dụng try/finally:

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

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

Điều này đảm bảo rằng ngay cả khi # do stuff with f đặt ra một ngoại lệ, f vẫn sẽ được đóng đúng cách.

Lưu ý rằng open sẽ xuất hiện bên ngoài trong số try. Nếu open chính nó làm tăng ngoại lệ, tệp không được mở và không cần đóng. Ngoài ra, nếu open làm tăng ngoại lệ, kết quả là không phải được gán cho f và đó là lỗi để gọi f.close().

+0

Rất đơn giản, cảm ơn. Vì lý do nào đó, tôi đã mong rằng tôi cần một thứ gì đó liên quan hơn. –

+14

Nếu 'mở' thất bại, một ngoại lệ sẽ được nâng lên trước khi khối' try/finally' được nhập vào. Vì vậy, 'close' sẽ không được gọi. (Đó là lý do tại sao bạn nên gọi 'mở' trước 'try'.) – FogleBird

+1

@TM Tôi đã thêm một lưu ý về' mở' để đưa ra một ngoại lệ. –

-4

Dưới đây là ví dụ đưa ra đó vậy làm thế nào để sử dụng open và "trăn close

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() 

Đó là cần thiết để bao nhiêu lần bạn mở tập tin phải đóng mà lần.

+1

Nếu ngoại lệ được nâng lên sau khi 'mở' nhưng trước khi' đóng', tệp sẽ không được đóng đúng cách bằng cách sử dụng phương pháp này. Sử dụng 'with' hoặc' try'/'finally' đóng tập tin đúng ngay cả khi có ngoại lệ. –

26

Trong giải pháp trên, lặp đi lặp lại tại đây:

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

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

nếu có điều gì đó xấu xảy ra (bạn không bao giờ biết ...) sau khi mở tệp thành công và trước e thử, tệp sẽ không bị đóng, vì vậy giải pháp an toàn hơn là:

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

    # do stuff with f 

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

Điều này là chính xác. Tại sao nó được bình chọn? – Dexter