2010-10-13 33 views
26

Tôi muốn sử dụng tempfile.NamedTemporaryFile() để viết một số nội dung vào đó và sau đó mở tệp đó. Tôi đã viết mã sau:cách sử dụng tempfile.NamedTemporaryFile() trong python

tf = tempfile.NamedTemporaryFile() 
tfName = tf.name 
tf.seek(0) 
tf.write(contents) 
tf.flush() 

nhưng tôi không thể mở tệp này và xem nội dung của nó trong notepad hoặc ứng dụng tương tự. Có bất kì cách nào để đạt được điều này không? Tại sao không thể tôi làm điều gì đó như:

os.system('start notepad.exe ' + tfName) 

vào cuối

+1

Tại sao bạn cần sử dụng 'tempfile'? Bạn không thể chỉ sử dụng một tập tin bình thường, đặc biệt là nếu bạn muốn lưu nó sau đó? –

+1

Tôi không muốn lưu nó trên hệ thống của mình. Tôi chỉ muốn những nội dung đó được mở dưới dạng văn bản trong notepad hoặc ứng dụng tương tự và xóa tệp khi tôi đóng ứng dụng đó – Manoj

Trả lời

39

Đây có thể là một trong hai lý do:

Thứ nhất, theo mặc định các tập tin tạm thời là deleted as soon as it is closed. Để khắc phục việc sử dụng này:

tf = tempfile.NamedTemporaryFile(delete=False) 

và sau đó xóa tệp thủ công khi bạn đã xem xong tệp đó trong ứng dụng khác.

Ngoài ra, có thể do tệp vẫn mở trong Python Windows sẽ không cho phép bạn mở tệp bằng ứng dụng khác.

+16

Vậy cách tốt nhất để xóa nội dung khi tôi hoàn thành nó là gì? 'tf.unlink'? 'os.remove'? 'path.remove'? –

+1

@ThomasAhle Bạn sẽ sử dụng cái gì? –

+0

Bạn cần thêm nhập: 'nhập tempfile' để sử dụng. –

20

Bạn cũng có thể sử dụng nó với trình quản lý ngữ cảnh để tệp sẽ bị đóng/xóa khi nó nằm ngoài phạm vi. Nó cũng sẽ được dọn sạch nếu mã trong trình quản lý ngữ cảnh tăng lên.

import tempfile 
with tempfile.NamedTemporaryFile() as temp: 
    temp.write('Some data') 
    temp.flush() 

    # do something interesting with temp before it is destroyed 
+3

Hãy nhớ rằng bạn không thể thực sự chuyển 'temp.name' sang các tiến trình khác để làm điều gì đó với nó trên Windows (có vẻ như là nền tảng của OP). Từ hướng dẫn sử dụng: "Tên có thể được sử dụng để mở tệp lần thứ hai hay không, trong khi tệp tạm thời được đặt tên vẫn mở, thay đổi trên các nền tảng (nó có thể được sử dụng trên Unix; không thể chạy trên Windows NT trở lên)." – Vegard

+0

Không chắc chắn nếu nó sẽ giúp đỡ trong bất kỳ cách nào, nhưng Django ghi đè lên các NamedTemporaryFile vì vậy nó sẽ làm việc với Windows vì vậy nó có thể là giá trị nhìn vào những gì họ đã làm để làm cho điều đó xảy ra: https://code.djangoproject.com/wiki/NamedTemporaryFile – vjimw

+2

Có vẻ như việc gọi 'flush' là cần thiết (Nếu không, tôi sẽ gặp lỗi trong một tiến trình con được gọi để đọc từ tệp). –

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