权限被拒绝写入我的临时文件

时间:2014-04-22 06:49:53

标签: python temporary-files

我正在尝试使用Python在Windows操作系统上创建和写入临时文件。我使用Python模块tempfile来创建一个临时文件。

但是当我去写那个临时文件时,我收到错误Permission Denied。我不允许写临时文件吗?!难道我做错了什么?如果我想创建和写入临时文件,我应该如何在Python中执行此操作?出于安全目的,我想在临时目录中创建一个临时文件,而不是在本地创建(在.exe正在执行的目录中)。

IOError: [Errno 13] Permission denied: 'c:\\users\\blah~1\\appdata\\local\\temp\\tmpiwz8qw'

temp = tempfile.NamedTemporaryFile().name
f = open(temp, 'w') # error occurs on this line

6 个答案:

答案 0 :(得分:36)

NamedTemporaryFile实际上为您创建了文件,您无需打开它进行写入。

事实上,Python docs州:

  

该名称是否可用于第二次打开文件,而命名的临时文件仍处于打开状态,因平台而异(它可以在Unix上使用; 它不能在Windows NT或更高版本上使用)。

这就是您获得权限错误的原因。你可能追求的是:

f = tempfile.NamedTemporaryFile(mode='w') # open file
temp = f.name                             # get name (if needed)

答案 1 :(得分:2)

请考虑改用os.path.join(tempfile.gettempdir(), os.urandom(24).hex())。它是可靠的,跨平台的,唯一的警告是它不适用于FAT分区。

NamedTemporaryFile有很多问题,其中最重要的一个问题是它可能由于权限错误而无法创建文件,无法检测到权限错误,然后循环数百万次,从而使程序和文件系统挂起。

答案 2 :(得分:2)

the original answer by Erik Aronesty上扩展了以下命名临时文件的自定义实现:

import os
import tempfile


class CustomNamedTemporaryFile:
    """
    This custom implementation is needed because of the following limitation of tempfile.NamedTemporaryFile:

    > Whether the name can be used to open the file a second time, while the named temporary file is still open,
    > varies across platforms (it can be so used on Unix; it cannot on Windows NT or later).
    """
    def __init__(self, mode='wb', delete=True):
        self._mode = mode
        self._delete = delete

    def __enter__(self):
        # Generate a random temporary file name
        file_name = os.path.join(tempfile.gettempdir(), os.urandom(24).hex())
        # Ensure the file is created
        open(file_name, "x").close()
        # Open the file in the given mode
        self._tempFile = open(file_name, self._mode)
        return self._tempFile

    def __exit__(self, exc_type, exc_val, exc_tb):
        self._tempFile.close()
        if self._delete:
            os.remove(self._tempFile.name)

答案 3 :(得分:0)

使用如下的delete参数:

tmpf = NamedTemporaryFile(delete = False)

错误参考:https://github.com/bravoserver/bravo/issues/111

致谢, Vidyesh

答案 4 :(得分:0)

这个问题可能比你们许多人想象的更复杂。无论如何,这是我的解决方案:

  1. 利用atexit模块
def delete_files(files):
    for file in files:
        file.close()
        os.unlink(file.name)
  1. 使NamedTemporaryFile delete=False
temp_files = []
 
result_file = NamedTemporaryFile(dir=tmp_path(), suffix=".xlsx", delete=False)
self.temp_files.append(result_file)
  1. 注册 delete_files 作为清理函数
atexit.register(delete_files, temp_files)

答案 5 :(得分:-1)

权限被拒绝,因为文件在代码的第二行处于打开状态。

首先使用f.close()将其关闭,然后就可以开始在临时文件上写