2010-03-08 38 views

Trả lời

17

Nên đóng tập tin xử lý trong bản Tuyên Bố của tập tin __del__, nhưng một cách tiếp cận tốt hơn sẽ được sử dụng một khối with:

def read_contents(file_path): 
    with open(file_path, 'r') as f: 
    return f.read() 

Xem http://docs.python.org/library/stdtypes.html#file.close để biết thêm thông tin.

+0

Chỉ cần đề cập: tệp trả về đối tượng tệp có phương thức đóng. Đó sẽ là giải pháp chuyển tiếp thẳng thắn nhất, nhưng "với" rõ ràng là giải pháp đẹp hơn. – Achim

+0

Tôi gặp vấn đề - Tôi không có 'with' trong Python của mình. Có thể nhập từ tương lai không? Tôi có Python 2.5. – bodacydo

+0

Nếu bạn có Python 2.5, thì có. –

28

Để mở rộng câu trả lời của FogleBird, nếu bạn không đóng nó một cách rõ ràng thì tệp sẽ tự động bị đóng khi đối tượng tệp bị hủy. Trong CPython, điều này sẽ xảy ra ngay khi không có thêm tham chiếu đến nó, ví dụ: nếu nó là một biến cục bộ trong một hàm và hàm kết thúc. Tuy nhiên, nếu một ngoại lệ được ném vào hàm và tệp không được đóng một cách rõ ràng bằng cách sử dụng câu lệnh with hoặc try:...finally: thì tham chiếu đến tệp sẽ được giữ như một phần của dấu vết ngăn xếp trong đối tượng truy nguyên và tệp sẽ không bị đóng, tại ít nhất cho đến khi ngoại lệ tiếp theo được ném.

Ngoài ra IronPython và Jython sử dụng các cơ sở thu thập rác của .Net CLR và Java JVM tương ứng. Đây không phải là tài liệu tham khảo được tính, do đó, các tập tin sẽ vẫn mở vô thời hạn cho đến khi người thu gom rác quyết định đòi lại bộ nhớ của đối tượng hoặc chương trình chấm dứt.

Vì vậy, nói chung điều quan trọng là phải đóng tệp một cách rõ ràng bằng cách sử dụng with: hoặc try:...finally:.

Tất nhiên tất cả điều này là đúng đối với bất kỳ loại đối tượng nào khác yêu cầu dọn dẹp rõ ràng.

+1

+1, tất cả những điểm tốt mà tôi không bận tâm đề cập đến. :) – FogleBird

+1

"không bận tâm" - tôi không biết bất kỳ điều này. :( – bodacydo

+0

Cảm ơn bạn đã đề cập đến tất cả những điểm quan trọng này! – bodacydo

Các vấn đề liên quan