Khi nào tập tin bị đóng?
Như chúng ta có thể học hỏi từ việc đóng tập tin rõ ràng có quan trọng không? (StackOverflow) , trình thông dịch Python đóng tệp trong các trường hợp sau:
- bạn gọi thủ công
close()
phương thức của một file
đối tượng một cách rõ ràng hoặc ngầm định bằng cách để lại một with open(...):
khối. Điều này tất nhiên luôn luôn và trên bất kỳ triển khai Python nào.
- các
file
tài liệu tham khảo cuối cùng của đối tượng bị loại bỏ và do đó các đối tượng được xử lý bởi rác Collector. Đây không phải là một tính năng ngôn ngữ, mà chỉ là một tính năng đặc biệt của việc triển khai CPython, vì vậy đối với tính di động, đừng dựa vào điều này!
- trình thông dịch Python chấm dứt. Trong trường hợp này, nó sẽ đóng tất cả các thẻ điều khiển đã được mở. Một số phiên bản cũ hơn của Python3 cũng đã in một cảnh báo rằng bạn nên tự đóng chúng lại. Tuy nhiên, hãy tưởng tượng một sự cố hoặc bạn buộc giết trình thông dịch Python và bạn sẽ thấy rằng điều này cũng không đáng tin cậy.
Vì vậy, chỉ có phương pháp (thủ công) đầu tiên là đáng tin cậy!
Điều gì sẽ xảy ra nếu một tập tin vẫn mở?
Đầu tiên, tùy thuộc vào việc triển khai trình thông dịch Python của bạn, nếu bạn đã mở một tệp có quyền truy cập ghi, bạn không thể chắc chắn rằng các sửa đổi của mình đã bị xóa vào đĩa cho đến khi bạn tự tạo ra nó hoặc trình xử lý tệp bị đóng.
Thứ hai, bạn chỉ có thể mở một số lượng tệp giới hạn trên hệ thống của mình cho mỗi người dùng. Nếu bạn vượt quá giới hạn này bằng cách mở nhiều tệp trong một vòng lặp trong chương trình Python của bạn mà không đóng chúng càng sớm càng tốt, hệ thống có thể từ chối mở các thẻ xử lý tệp tiếp theo cho bạn và bạn sẽ nhận được một ngoại lệ. Nó cũng có thể xảy ra rằng chương trình của bạn lấy tệp mở được phép cuối cùng và một chương trình khác sẽ thất bại vì nó bị từ chối.
Thứ ba, mở các tệp trên một thiết bị di động để ngăn không cho nó bị ngắt kết nối hoặc bị đẩy ra. Bạn vẫn có thể xóa tệp trên một số hệ thống tệp như ext4
, trong đó đơn giản là mô tả tệp / liên kết cứng đến nút inode của tệp bị xóa / hủy liên kết nhưng chương trình đã mở tệp vẫn có thể truy cập vào nút thông qua trình xử lý tệp tạm thời của chính nó. Đây cũng là cơ chế cho phép bạn cập nhật các gói trong khi phần mềm tương ứng đang chạy. Tuy nhiên, ví dụ NTFS không có tính năng như vậy. Tuy nhiên, nó có thể không bao giờ được sửa đổi bởi hai quy trình đồng thời, do đó nó sẽ vẫn bị chặn bằng cách nào đó cho những người khác.
with open (file_name, ...) as variable:
tự động gọiclose()
phương thức ngay khi bạn rời khỏi khối mã này.