Để 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.
Nguồn
2010-03-08 20:55:52
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
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
Nếu bạn có Python 2.5, thì có. –