2016-01-11 15 views
5

Dưới đây là code ví dụ của tôi:Không thể xóa một tập tin mà tạo ra bởi `tempfile.mkstemp()` trên Windows

import os 
from tempfile import mkstemp 

fname = mkstemp(suffix='.txt', text=True)[1] 
os.remove(fname) 

Khi tôi chạy nó trên Linux của tôi, nó hoạt động tốt. Nhưng khi tôi chạy nó trên Windows XP của tôi sử dụng Python 3.4.4, nó lớn lên được lỗi sau:

Traceback (most recent call last): 
    File "C:\1.py", line 5, in <module> 
    os.remove(fname) 
PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'C:\\DOCUME~1\\IEUser\\LOCALS~1\\Temp\\tmp3qv6ppcf.txt' 

Tuy nhiên, khi tôi sử dụng tempfile.NamedTemporaryFile() để tạo ra một tập tin tạm thời và đóng nó lại, nó xóa tự động.

Tại sao Windows không thể xóa tệp được tạo bởi mkstemp? Tôi đang làm gì sai?

+0

Bạn đã thử đóng nó đầu tiên? –

+0

@ IgnacioVazquez-Abrams: Huh? Tôi mở nó ở đâu? Không phải là 'mkstemp()' chỉ cần tạo tệp? Không có 'mở()' trong mã của tôi và 'fname' là một đối tượng chuỗi. –

+2

Lưu ý rằng mkstemp() trả về một ** tuple ** với một bộ xử lý mở. Cho đến khi bạn không đóng mà xử lý các tập tin đang được sử dụng (... bởi một quá trình: của riêng bạn). Nó hoạt động trên Windows vì cách os.remove() hoạt động (_On Windows, cố gắng loại bỏ một tệp đang được sử dụng làm cho ngoại lệ được nâng lên; trên Unix, mục nhập thư mục bị xóa nhưng lưu trữ được cấp phát cho tệp không có sẵn cho đến khi tệp gốc không còn được sử dụng nữa_). –

Trả lời

10

Từ the documentation:

Creates a temporary file in the most secure manner possible. [...]

[...]

mkstemp() returns a tuple containing an OS-level handle to an open file (as would be returned by os.open()) and the absolute pathname of that file, in that order.

fd, fname = mkstemp(suffix='.txt', text=True) 
os.close(fd) 
os.remove(fname) 
Các vấn đề liên quan