2010-07-30 40 views
6

thể trùng lặp:
check what files are open in PythonLiệt kê tất cả các xử lý tệp đang mở?

Xin chào,

Có thể để có được một danh sách của tất cả các xử lý tập tin đang mở, tôi đoán rằng chúng được lưu trữ ở đâu đó trong môi trường .

Tôi quan tâm đến hàm isis vì tôi muốn xử lý một cách an toàn bất kỳ tệp nào đang mở khi có lỗi nghiêm trọng, tức là xử lý tệp gần và thay thế các tệp có khả năng bị hỏng bằng các tệp gốc.

Tôi có thao tác xử lý nhưng không biết xử lý tệp nào đang mở, tôi không thể triển khai ý tưởng này.

Là một sang một bên, khi xử lý tệp được khởi tạo, điều này có thể được kế thừa bằng một phương thức đã nhập khác không?

Cảm ơn bạn

+3

Bản sao của http://stackoverflow.com/questions/2023608/check-what-files-are-open-in-python – robert

+0

mà o/s? Và nó có thể giúp thêm nó như là một thẻ quá. – Mawg

Trả lời

3

Các đẹp cách để làm điều này sẽ được sửa đổi mã của bạn để theo dõi khi nào nó sẽ mở ra một tập tin:

def log_open(*args, **kwargs): 
    print("Opening a file...") 
    print(*args, **kwargs) 
    return open(*args, **kwargs) 

Sau đó, sử dụng log_open thay vì open để mở tệp. Bạn thậm chí có thể làm một cái gì đó hacky hơn, giống như sửa đổi các lớp học File để đăng nhập chính nó. Điều đó được đề cập trong câu hỏi được liên kết ở trên.

Có lẽ một ghê tởm, bẩn thỉu Hack liên quan đến việc thu gom rác hoặc tìm trong __dict__ hoặc một cái gì đó, nhưng bạn không muốn làm điều đó trừ khi bạn hoàn toàn thực sự thực sự nghiêm túc phải.

0

Nếu bạn đang sử dụng python 2.5+ bạn có thể sử dụng từ khóa with (mặc dù nhu cầu 2,5 'từ tương lai with_statement nhập khẩu)

with open('filename.txt', 'r') as f: 
    #do stuff here 
    pass 
#here f has been closed and disposed properly - even with raised exceptions 

Tôi không biết những gì loại thất bại thảm khốc cần bork tuyên bố with, nhưng tôi cho rằng đó là một tuyên bố thực sự tồi tệ. Trên WinXP, kiểm tra nhanh không khoa học của tôi:

import time 
with open('test.txt', 'w') as f: 
    f.write('testing\n') 
    while True: 
     time.sleep(1) 

và sau đó giết quá trình bằng Trình quản lý tác vụ Windows vẫn ghi dữ liệu vào tệp.

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