Là đóng một tệp sau khi đã mở nó với `open ()` được yêu cầu trong Python? [đóng cửa]


9

Về câu hỏi trước đây của tôi , tôi nhận thấy rằng trong cả hai câu trả lời sử dụng open()hàm này, không có đề cập đến việc đóng tệp.

Tôi đã đọc rằng đó là một thực hành tốt để làm như vậy, nhưng thực sự có cần nó không? Có phải nó chỉ là mã không cần thiết?

Tập tin có được đóng tự động không?


1
with open (file_name, ...) as variable:tự động gọi close()phương thức ngay khi bạn rời khỏi khối mã này.
Chỉ huy Byte


@ByteCommander bạn có muốn đưa ra nhận xét của mình dưới dạng câu trả lời, để làm cho câu hỏi này được 'giải quyết' không?
TellMeTại sao

1
Trong python3, tập tin được tự động thu thập một khi nó không có thêm tài liệu tham khảo.
Jacob Vlijm

4
Tôi đang bỏ phiếu để đóng câu hỏi này ngoài chủ đề vì đây là câu hỏi chung về Python không có kết nối với tập lệnh trên Ubuntu. đó là hỏi về thực tiễn tốt nhất trong ngôn ngữ lập trình.
terdon

Câu trả lời:


9

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 filetà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.


Không hoàn toàn đúng với python3 !!
Jacob Vlijm

@JacobVlijm Bạn có phiền giải thích về nó không?
Chỉ huy Byte

Xem bình luận bên dưới câu hỏi. Câu trả lời về "thực hành không tốt" trong liên kết câu trả lời của bạn là từ năm 2011. Nếu nó từng tồn tại, cảnh báo trong python3đó không còn tồn tại nữa và câu trả lời đã lỗi thời. Thu gom rác tự động tồn tại vì một lý do và hoạt động hoàn hảo. Nó đã được nhiều năm kể từ khi tôi sử dụng close()cụ thể. Không bao giờ gặp phải một lỗi duy nhất do không sử dụng nó.
Jacob Vlijm

Soo ... Bạn có biết liệu các triển khai khác như PyPy, Jython hoặc IronPython đóng các tệp theo cách tương tự CPython không? Và nếu tôi giết người phiên dịch, nó sẽ không có cơ hội đóng tệp, phải không? Và tôi cũng nghĩ rằng giới hạn tập tin mở vẫn được áp dụng. Điều gì về việc xóa dữ liệu bằng văn bản? Bạn biết gì hơn đến nay không?
Chỉ huy Byte

1
@JacobVlijm Cảm ơn vì tiền boa. : P Máy của tôi đã bị sập khi tạo tệp đó ... Tôi thậm chí không cần Python cho việc đó.
Chỉ huy Byte
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.