2013-06-15 48 views
27

Tôi có tệp tạm thời với một số nội dung và tập lệnh python tạo ra một số đầu ra cho tệp này. Tôi muốn điều này lặp lại N lần, vì vậy tôi cần phải tái sử dụng tập tin đó (thực sự là mảng các tập tin). Tôi đang xóa toàn bộ nội dung, vì vậy tệp tạm thời sẽ trống trong chu kỳ tiếp theo. Để xóa nội dung tôi sử dụng mã này:Cách xóa nội dung của tệp trong python

def deleteContent(pfile): 

    pfile.seek(0) 
    pfile.truncate() 
    pfile.seek(0) # I believe this seek is redundant 

    return pfile 

tempFile=deleteContent(tempFile) 

Câu hỏi của tôi là: Có cách nào khác (tốt hơn, ngắn hơn hoặc an toàn hơn) để xóa toàn bộ nội dung mà không thực sự xóa tệp tạm thời khỏi đĩa?

Thứ gì đó như tempFile.truncateAll()?

+1

Tìm kiếm thứ hai thực sự là thừa. Tại sao không chỉ tạo một tập tin tạm thời ** mới **? –

+0

Vì đối với một tập lệnh phổ biến, tôi sẽ cần ~ 400 tệp tạm thời thay vì ~ 10. Vì vậy, tôi nghĩ tốt hơn là tái chế chúng. Liệu tôi có sai? – bartimar

+0

Bạn có gặp phải bất kỳ vấn đề thực tế nào không? Tôi chỉ cần tạo các tệp tạm thời mới và cho phép Python và hệ điều hành dọn dẹp những tệp tôi đã đóng. –

Trả lời

58

Làm thế nào để xóa chỉ nội dung của tập tin trong python

Có nhiều cách để thiết lập kích thước hợp lý của một tập tin để 0, tuỳ theo cách bạn truy cập vào tập tin đó:

Để trống một tập tin mở:

def deleteContent(pfile): 
    pfile.seek(0) 
    pfile.truncate() 

Để xóa một tập tin mở mà tập tin mô tả được biết:

def deleteContent(fd): 
    os.ftruncate(fd, 0) 
    os.lseek(fd, 0, os.SEEK_SET) 

Để xóa một tập tin khép kín (có tên gọi)

def deleteContent(fName): 
    with open(fName, "w"): 
     pass 



Tôi có một tập tin tạm thời với một số nội dung [ ...] Tôi cần phải sử dụng lại t tập tin

Điều đó đang được nói, trong trường hợp chung mũ nó có lẽ là không hiệu quả và cũng không mong muốn tái sử dụng một tập tin tạm thời. Trừ khi bạn có nhu cầu rất cụ thể, bạn nên suy nghĩ về việc sử dụng tempfile.TemporaryFile và một người quản lý bối cảnh đến gần một cách minh bạch tạo/sử dụng/xóa các tập tin tạm thời của bạn:

import tempfile 

with tempfile.TemporaryFile() as temp: 
    # do whatever you want with `temp` 

# <- `tempfile` guarantees the file being both closed *and* deleted 
#  on exit of the context manager 
+0

'pfile.truncate (0)' sẽ không đặt lại con trỏ tệp, vì vậy bạn sẽ cần phải thực hiện một 'pfile.seek (0)' một trong hai cách. Tương tự áp dụng cho 'os.ftruncate()'. FWIW, bạn có thể lấy bộ mô tả tập tin từ 'pfile.fileno()', do đó, 'os.ftruncate (pfile.fileno(), 0)' sẽ hoạt động, nhưng bạn vẫn cần phải thực hiện 'pfile.seek (0) 'sau đó. – Aya

+2

Từ http://docs.python.org/2/library/stdtypes.html#file.truncate 'Lưu ý rằng nếu kích thước được chỉ định vượt quá kích thước hiện tại của tệp, kết quả sẽ phụ thuộc vào nền tảng: khả năng bao gồm tệp có thể vẫn còn không thay đổi, tăng kích thước được chỉ định như thể không được lấp đầy hoặc tăng lên kích thước được chỉ định với nội dung mới chưa được xác định. 'Đó là lý do tại sao tôi không làm điều đó. – bartimar

+0

Tôi đã thực sự nhìn vào tài liệu đó ngay bây giờ. Tôi hiểu rằng con trỏ tệp có thể ở vị trí của nó nếu nó vẫn hợp lệ (nghĩa là: trỏ trước phần cuối logic mới của tệp). Nhưng chúng ta cắt bỏ tập tin nào trước vị trí hiện tại? Vì vậy, tôi đã làm bài kiểm tra. Trên Linux, 'truncate (0)' không di chuyển vị trí hiện tại như được báo cáo bởi 'ftell()' - nhưng ghi tiếp theo được thực hiện ở đầu tệp như mong đợi. –

2

Điều gì có thể dễ dàng hơn một cái gì đó như thế này:

import tempfile 

for i in range(400): 
    with tempfile.TemporaryFile() as tf: 
     for j in range(1000): 
      tf.write('Line {} of file {}'.format(j,i)) 

Điều đó tạo ra 400 tệp tạm thời và ghi 1000 dòng cho mỗi tệp tạm thời. Nó thực hiện trong vòng chưa đầy 1/2 giây trên máy không đáng kể của tôi. Mỗi tệp tạm thời của tổng được tạo và xóa khi trình quản lý ngữ cảnh mở và đóng trong trường hợp này. Đó là nền tảng nhanh, an toàn và đa nền tảng.

Sử dụng tempfile tốt hơn rất nhiều so với cố gắng phát minh lại.

+1

Tôi nghĩ rằng 'tìm kiếm (0)' và 'truncate() 'không cho chu kỳ thực sự dễ dàng hơn, tốt hơn, (có thể nhanh hơn), và đẹp hơn với OS/python :) Tôi sợ rằng ai đó bị bắt vào tái sử dụng/tái chế ... Vẫn còn câu hỏi của tôi là như nhau, vì vậy đây thực sự không phải là câu trả lời. – bartimar

+2

Bạn đã thử nghiệm giả định đó chưa? Bạn đã hẹn giờ để xem chưa? – dawg

2

Bạn có thể làm điều này:

def deleteContent(pfile): 
    fn=pfile.name 
    pfile.close() 
    return open(fn,'w') 
2

Tôi nghĩ đơn giản nhất là chỉ cần mở tập tin trong chế độ ghi và sau đó đóng nó lại. Ví dụ, nếu tập tin của bạn myfile.dat chứa:

"This is the original content" 

Sau đó, bạn chỉ có thể viết:

f = open('myfile.dat', 'w') 
f.close() 

này sẽ xóa tất cả các nội dung. Sau đó, bạn có thể viết nội dung mới vào tệp:

f = open('myfile.dat', 'w') 
f.write('This is the new content!') 
f.close() 
Các vấn đề liên quan