2012-06-15 24 views
21

Tôi đang làm việc trên một tập lệnh Python cần tạo khoảng 50 tệp tạm thời riêng biệt, tất cả đều được nối thường xuyên trong quá trình tập lệnh và được hợp nhất vào cuối. Tôi chắc chắn rằng mô-đun tempfile có thể làm những gì tôi cần, nhưng tôi đã không thể tìm ra cách đọc tài liệu.Làm thế nào để sử dụng tempfile của Python.NamedTemporaryFile()?

Tôi muốn sử dụng các tệp tạm thời - trái với các biến - để bảo tồn bộ nhớ hệ thống, vì các khối dữ liệu này lớn lên khi tập lệnh xử lý hàng chục nghìn tệp khác.

Các đoạn mã sau đây là hack Tôi hiện đang sử dụng để tạo ra những tập tin này (untemporarily) trong một thư mục untemporary:

item = (string from another file) # string must id file for future use 
tmpfile = 'tmpfiles/' + item 
if item not in totalitems: 
    totalitems.add(item) 
    with open(tmpfile, 'w') as itemfile: 
     output = some stuff 
     tmpfile.write(output) 
else: 
    with open(tmpfile, 'a') as itemfile: 
     output = different stuff 
     tmpfile.write(output) 

Tôi nghĩ rằng những gì tôi cần là tempfile.NamedTemporaryFile(). Theo số documentation:

Tên đó có thể được lấy từ tên thành viên của đối tượng tệp.

Thật không may, tôi không hiểu điều đó có nghĩa là gì. Tôi chỉ cần có thể gọi lại từng tập tin sau khi tôi chạy lại "mục" tương ứng của nó một lần nữa trong các tập tin tôi đang xử lý. Tôi cho rằng điều này là khá thẳng về phía trước và tôi chỉ là dày đặc. Trong trường hợp nó quan trọng, tôi có các phiên bản của tập lệnh này cho cả Python 2.7.1 và 3.2.3. Tôi chỉ thực sự cần một hoặc một người khác để làm việc; Tôi tạo ra cả hai chỉ là một bài tập học tập.

+0

thể trùng lặp của [Cách tốt nhất để tạo ra tên tập tin ngẫu nhiên trong Python] (http://stackoverflow.com/questions/10501247/best-way- to-generated-random-file-name-in-python) – Joe

+1

@Joe, Một phần của câu hỏi này dường như là bản sao của chuỗi bạn đã liên kết. Một phần của nó không phải là; xem bình luận dưới câu trả lời của Levon dưới đây. – Gregory

+0

Tại sao bạn cần các tệp này để được đặt tên? Nếu chúng chưa được đặt tên (bị xóa trước), sẽ có ít sai sót hơn trong việc dọn dẹp. Bạn có thể chỉ cần lưu trữ đối tượng tmpfile, không phải tên của nó, và sau đó gọi 'seek (0)' để đi đến đầu để sẵn sàng đọc ... hoặc mmap nội dung của nó, hoặc truy cập nó theo cách bạn muốn. –

Trả lời

34

"Tên đó có thể được truy lục từ tên thành viên của đối tượng tệp."

có nghĩa là bạn có thể lấy tên của tập tin tạm được tạo ra như vậy:

In [4]: import tempfile 

In [5]: tf = tempfile.NamedTemporaryFile() 
In [6]: tf.name # retrieve the name of the temp file just created 
Out[6]: 'c:\\blabla\\locals~1\\temp\\tmptecp3i' 

Note: Theo mặc định file sẽ bị xóa khi nó được đóng lại. Tuy nhiên, nếu tham số delete sai, tệp sẽ không tự động bị xóa. Xem Python docs để biết thêm thông tin.

Vì bạn có thể truy xuất tên của từng tệp 50 temp mà bạn muốn tạo, bạn có thể lưu chúng, ví dụ: trong danh sách, trước khi bạn sử dụng lại chúng (như bạn nói). Chỉ cần đảm bảo đặt giá trị delete sao cho các tệp không biến mất khi bạn đóng chúng (trong trường hợp bạn định đóng, sau đó mở lại chúng).

tôi đã giải thích làm thế nào để tạo ra tên tập tin tạm thời một cách chi tiết hơn ở đây Best way to generate random file names in Python

+0

Cảm ơn bạn đã liên kết tới chuỗi với câu trả lời gốc của bạn. Tôi vẫn không chắc chắn về cách khóa tập tin với giá trị của một số biến "item". Tôi đã đánh vào ý tưởng sử dụng một từ điển cho điều đó; điều này có vẻ phù hợp sau dòng 5 trong mã của bạn ở trên không? 'item_tmpfile = {item: tf.name}'. Sau đó, sau đó tôi có thể gọi 'item_tmpfile [item]'. – Gregory

+0

@pyrogerg Có, tôi nghĩ rằng nên làm việc, bạn sẽ được kết hợp tên của mỗi tập tin tạm thời với một mục 'khác' nơi' mục' sẽ là chìa khóa để lấy tên tập tin tạm thời sau đó. Tôi cho rằng từ điển của bạn sẽ có 50 mục nhập, phải không? Bạn có định đóng các tệp giữa các lần sử dụng không? nếu như vậy hãy nhớ tham số 'delete'. – Levon

+0

Cảm ơn mẹo 'xóa'; Tôi đã hiểu điều đó trong câu trả lời ban đầu của bạn. Tôi nghĩ tôi đang đi đúng hướng rồi. Tôi đoán tôi có thể sử dụng những tệp này như bất kỳ tệp nào khác trong quá trình tập lệnh, ví dụ: 'với mở (item_tmpfiles [item]) là tf:'? – Gregory

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