Cách mở / đóng tệp an toàn trong python 2.4


86

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 Python. Máy chủ chỉ được cài đặt Python 2.4.4.

Tôi đã không bắt đầu sử dụng Python cho đến khi phiên bản 2.5 ra mắt, vì vậy tôi đã quen với biểu mẫu:

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

Tuy nhiên, không có withtuyên bố nào trước 2.5 và tôi đang gặp khó khăn khi tìm ví dụ về cách thích hợp để dọn dẹp đối tượng tệp theo cách thủ công.

Phương pháp hay nhất để loại bỏ các đối tượng tệp một cách an toàn khi sử dụng phiên bản cũ của python là gì?

Câu trả lời:


139

Xem docs.python.org :

Khi bạn hoàn thành một tệp, hãy gọi f.close () để đóng tệp đó và giải phóng mọi tài nguyên hệ thống mà tệp đang mở đã chiếm dụng. Sau khi gọi f.close (), các nỗ lực sử dụng đối tượng tệp sẽ tự động không thành công.

Do đó sử dụng một close()cách thanh lịch với 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 ftăng một ngoại lệ, fvẫn sẽ được đóng đúng cách.

Lưu ý rằng opensẽ xuất hiện bên ngoài của try. Nếu openchính nó tạo ra một ngoại lệ, thì tệp đó đã không được mở và không cần phải đóng lại. Ngoài ra, nếu opentăng một ngoại lệ, kết quả của nó không được gán fvà nó là một lỗi khi gọi f.close().


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

16
Nếu openkhông thành công, một ngoại lệ sẽ được đưa ra trước khi try/finallykhối được nhập. Vì vậy closesẽ không được gọi. (Đó là lý do tại sao bạn nên gọi opentrước try.)
FogleBird

1
@TM Tôi đã thêm một lưu ý về openviệc nêu ra một ngoại lệ.
Jon-Eric

4
Đây là những gì câu lệnh with có nghĩa là đằng sau hậu trường.
Arlaharen

1
Việc mở tệp sẽ diễn ra trong thời gian thử.
Anthony Rutledge

32

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

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

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

nếu đ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 khi 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()

Sử dụng một với mở (...) tuyên bố, bất kể như thế nào với khối xong (ngay cả với một ngoại lệ) tập tin được đóng lại
darkgaze

@darkgaze with open(...)chắc chắn là lựa chọn tốt nhất trong Python hiện đại.
mljrg

11

Không cần phải đóng tệp theo tài liệu nếu bạn sử dụng với:

Nên sử dụng từ khóa with khi xử lý các đối tượng tệp. Điều này có lợi thế là tệp được đóng đúng cách sau khi bộ của nó kết thúc, ngay cả khi một ngoại lệ được đưa ra trên đường đi. Nó cũng ngắn hơn nhiều so với việc viết các khối try-last tương đương:

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

Thêm tại đây: https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects


Điều này vừa đúng vừa không rõ ràng đối với câu hỏi.
Jon-Eric

-4

Đây là ví dụ được đưa ra để làm thế nào để sử dụng openvà "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()

Bạn cần mở tệp bao nhiêu lần thì phải đóng số lần đó.


1
Nếu một ngoại lệ được đưa ra sau opennhưng trước đó close, 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 withhoặc try/ finallyđóng tệp đúng cách ngay cả khi có ngoại lệ.
Jon-Eric
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.