2011-01-05 35 views
18

Tôi nghĩ rằng câu hỏi này là nhiều hơn một "phong cách mã hóa" hơn là vấn đề kỹ thuật.python đóng tập tin mô tả câu hỏi

Nói tôi có một dòng mã:

buf = open('test.txt','r').readlines() 
... 

sẽ mô tả tập tin tự động đóng, hoặc sẽ nó ở lại trong bộ nhớ? Nếu bộ mô tả tập tin không được đóng, cách nào thích hơn để đóng nó?

Trả lời

35

Nếu bạn gán các đối tượng tập tin vào một biến, bạn rõ ràng có thể đóng nó bằng cách sử .close()

f = open('test.txt','r') 
buf = f.readlines() 
f.close() 

Ngoài ra (và nói chung là nhiều người ưa thích), bạn có thể sử dụng with từ khóa (Python 2.5 và cao hơn) như đã đề cập trong Python docs:

Đó là thực tế tốt để sử dụng các with từ khóa khi xử lý tệp đối tượng. Điều này có lợi thế là tệp được đóng đúng sau khi bộ hoàn thành, ngay cả khi ngoại lệ được nâng lên trên đường. Nó cũng là ngắn hơn nhiều vì viết tương đương thử-cuối cùng khối:

>>> with open('test.txt','r') as f: 
...  buf = f.readlines() 
>>> f.closed 
True 
+1

"buf" trong trường hợp này sẽ là một danh sách - không có "đóng" phương pháp trên đó. – jsbueno

+3

'with' có sẵn trong 2.5, nhưng bạn cần phải nhập nó bằng cách sử dụng' from __future__ import with_statement'. Điều này là không cần thiết từ 2,6 trở đi. –

+0

@jsbueno cảm ơn vì đã gặp lỗi của tôi!Tôi đã cập nhật câu trả lời để phản ánh quan sát của bạn! @Jay Conrod, cảm ơn thông tin! (Tôi đã nhảy từ 2,4 đến 2,7, vì vậy tôi chưa bao giờ trải nghiệm điều đó!) – sahhhm

5

Nó sẽ ở lại trong bộ nhớ cho đến khi bộ thu gom rác đóng. Bạn phải luôn đóng các trình mô tả tệp của mình một cách rõ ràng. Chỉ cần làm một cái gì đó như thế này:

with open('test.txt', 'r') as f: 
    buf = f.readlines() 
+5

Nói đúng cách, việc sử dụng không được "rõ ràng" đóng tệp ... –

+0

@Hugh Bothwell: Hmm. Tôi đoán nó phụ thuộc vào định nghĩa của bạn một cách rõ ràng. Tôi sẽ gọi nó rõ ràng là đóng nó lại. – Falmarri

+1

Nó rõ ràng hơn cho đến nay vì bây giờ chúng ta biết chính xác khi nào tệp sẽ bị đóng, nhưng nó không thực sự là những gì tôi sẽ gọi rõ ràng theo nghĩa lập trình. –

13

Thông thường trong CPython, các tập tin được đóng lại ngay lập tức khi các tính tham khảo giảm xuống zero (mặc dù hành vi này không được bảo đảm cho tương lai phiên bản của CPython)

Trong các triển khai khác, chẳng hạn như Jython, tệp sẽ không bị đóng cho đến khi được thu thập, có thể sau một thời gian dài.

Phong cách kém để có mã hoạt động khác nhau tùy thuộc vào hành vi của triển khai.

Nếu nó chỉ cho một kịch bản quickie hoặc một cái gì đó bạn đang cố gắng trong thông dịch shell nó đủ tốt, nhưng đối với bất kỳ loại công việc sản xuất bạn thường nên sử dụng một người quản lý bối cảnh như trong câu trả lời Falmarri của

+0

+1 Điểm thực tế tốt. – martineau

+1

Một ví dụ về việc bitting coder trong các triển khai Python khác nhau là Mercurial sẽ loại bỏ số lượng các tệp mở được cho phép bởi hệ điều hành khi chạy trên PyPy. Mercurial đang trải qua những thay đổi để sửa lỗi này. – TryPyPy

1

Nó sẽ tự động đóng, nhưng nó phụ thuộc vào việc thực hiện chính xác khi nào. Nó đẹp hơn để sử dụng một cách rõ ràng với khối, nhưng nếu bạn chỉ viết một kịch bản nhỏ cho chính mình mà bạn thỉnh thoảng chạy nó không thực sự quan trọng.

+0

Kích thước của tập lệnh và tần suất chạy là không liên quan đến thăng hoa. Nếu kịch bản lặp lại qua nhiều tệp mở chúng, nó thực sự quan trọng nếu nó không đóng chúng. Sớm hay muộn nó sẽ chạy ra khỏi tay cầm và sụp đổ. –

+1

Bạn nói đúng, tôi đã bỏ lỡ viết phần quan trọng: Đó là cho bản thân và đôi khi. Bởi vì sau đó, khi anh ta hết tập tin, anh ta sẽ nhận ra. ;) Nhưng nếu anh ta đặt nó tại một trang web của khách hàng. : - / –

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