2009-02-22 24 views
5

Tôi đang sử dụng các cửa sổ với Python 2.5. Tôi có một tập tin mở để viết. Tôi viết một số dữ liệu. Tập tin cuộc gọi đóng. Khi tôi cố gắng xóa các tập tin từ thư mục bằng cách sử dụng Windows Explorer, nó lỗi, nói rằng một quá trình vẫn giữ một xử lý cho tập tin.Tại sao Python không xử lý tệp tin sau khi gọi tệp.close()?

Nếu tôi tắt python và thử lại, nó thành công.

+0

Tôi chưa bao giờ biết Pythons phát hành * bất cứ điều gì * dễ dàng, cho phép các tệp nhỏ kém. : P: P – Cerebrus

+0

@Cerberus Tee hee! – Pitarou

+1

Thử đăng chương trình hoàn chỉnh nhỏ nhất mà bạn có thể thực hiện để hiển thị lỗi. Điều này không nên xảy ra vì vậy nó có thể là một cái gì đó đơn giản để sửa chữa. – dwc

Trả lời

4

Nó đóng chúng lại. Bạn có chắc chắn f.close() đang được gọi không? Tôi vừa thử nghiệm cùng một kịch bản và cửa sổ xóa tệp cho tôi.

2

Bạn có đang xử lý bất kỳ ngoại lệ nào xung quanh đối tượng tệp không? Nếu vậy, hãy chắc chắn việc xử lý lỗi trông giống như sau:

f = open("hello.txt") 
try: 
    for line in f: 
     print line 
finally: 
    f.close() 

Trong khi xem xét lý do tại sao bạn nên làm điều này, hãy xem xét các dòng mã sau đây:

f = open('hello.txt') 
try: 
    perform_an_operation_that_causes_f_to_raise_an_exception() 
    f.close() 
except IOError: 
    pass 

Như bạn thấy, f.close sẽ không bao giờ được gọi trong mã trên. Vấn đề là mã trên cũng sẽ làm cho f không thu gom rác. Lý do là f sẽ vẫn được tham chiếu trong sys.traceback, trong trường hợp đó, giải pháp duy nhất là gọi thủ công trên f trong một khối cuối cùng hoặc đặt sys.traceback thành None (và tôi khuyên bạn nên sử dụng lệnh trước đó).

3

Giải thích trong hướng dẫn:

with open('/tmp/workfile', 'r') as f: 
    read_data = f.read() 

Nó hoạt động khi bạn viết hoặc tẩy/unpickling, quá

Nó không thực sự cần thiết mà cố gắng cuối cùng khối: Java cách làm việc, không Python

+0

Bạn chắc chắn muốn có khối 'cuối cùng' nếu mã trước khi nó có cơ hội ném một ngoại lệ, mà bất kỳ thao tác tệp nào cũng có khả năng thực hiện. – Davy8

+0

Davy: Từ python 2.5 trở đi, đối tượng tệp đã được trang bị phương thức '_enter_' và' _exit_'. Python đánh giá biểu thức, gọi phương thức '_enter_', sau đó thực thi phần mã, và bất kể điều gì xảy ra trong mã đó, hãy gọi phương thức' _exit_' của đối tượng bảo vệ. Nó sẽ chăm sóc ngoại lệ và luôn đóng tệp. Với sự thay thế cố gắng cuối cùng. Bạn phải bật nó: 'from __future__ import with_statement' –

0

Tôi đang tìm kiếm điều này, bởi vì điều tương tự đã xảy ra với tôi. Câu hỏi không giúp tôi, nhưng tôi nghĩ tôi đã tìm ra chuyện gì đã xảy ra.

Trong phiên bản gốc của tập lệnh mà tôi đã viết, tôi đã bỏ qua thêm một mệnh đề 'cuối cùng' vào tệp trong trường hợp ngoại lệ.

Tôi đã thử nghiệm tập lệnh từ dấu nhắc tương tác và có ngoại lệ trong khi tệp được mở. Những gì tôi đã không nhận ra là các đối tượng tập tin đã không được thu gom rác ngay lập tức. Sau đó, khi tôi chạy tập lệnh (vẫn từ cùng một phiên tương tác), mặc dù các đối tượng tệp mới đã bị đóng, tệp đầu tiên vẫn chưa được xử lý và do đó việc xử lý tệp vẫn đang được sử dụng, từ quan điểm của hệ điều hành.

Khi tôi đóng dấu nhắc tương tác, sự cố đã biến mất, tại đó tôi nhớ rằng ngoại lệ xảy ra khi tệp đã được mở và nhận ra những gì đang diễn ra. (Đạo đức: Đừng cố gắng lập trình cho giấc ngủ không đủ.))

Đương nhiên, tôi không biết đây có phải là điều xảy ra trong trường hợp áp phích gốc hay không, và ngay cả khi áp phích gốc vẫn còn có thể không nhớ các trường hợp cụ thể, nhưng các triệu chứng tương tự nhau, vì vậy tôi nghĩ rằng tôi muốn thêm điều này như một cái gì đó để kiểm tra, cho bất cứ ai bị bắt trong tình huống tương tự và tìm kiếm một câu trả lời.

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