蟒蛇临时文件| NamedTemporaryFile 不能使用生成的临时文件

问题描述

我想加载临时文件以进行更改或只是能够将其上传到某个地方, 当我尝试这样做时 - 它会引发如下所示的错误

我已将权限设置为 w+ - 理想情况下应该允许我读写,不确定我在这里遗漏了什么 - 任何帮助将不胜感激 - 谢谢

>>> from openpyxl import load_workbook
>>> from tempfile import NamedTemporaryFile
>>> import os                     
>>> with NamedTemporaryFile(suffix=".xlsx",mode='w+',delete=True) as tmp:
...     temp_path = tmp.name                
...     os.path.exists(temp_path)           
...     wb = load_workbook(temp_path)       
... 
True
Traceback (most recent call last):
  File "<stdin>",line 4,in <module>
  File "C:\Users\my_name\VS_PROJECTS\.venv\lib\site-packages\openpyxl\reader\excel.py",line 315,in load_workbook
    reader = ExcelReader(filename,read_only,keep_vba,File "C:\Users\my_name\VS_PROJECTS\.venv\lib\site-packages\openpyxl\reader\excel.py",line 124,in __init__
    self.archive = _validate_archive(fn)
  File "C:\Users\my_name\VS_PROJECTS\.venv\lib\site-packages\openpyxl\reader\excel.py",line 96,in _validate_archive
    archive = ZipFile(filename,'r')
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.2288.0_x64__qbz5n2kfra8p0\lib\zipfile.py",line 1251,in __init__
    self.fp = io.open(file,filemode)
PermissionError: [Errno 13] Permission denied: 'C:\\Users\\my_name\\AppData\\Local\\Temp\\tmp5dsrqegj.xlsx'

解决方法

显然,您使用的是 Windows。

在 Windows 上,您无法在 O_TEMPORARY 文件仍然打开时打开另一个句柄(参见例如 https://github.com/bravoserver/bravo/issues/111https://docs.python.org/3/library/tempfile.html#tempfile.NamedTemporaryFilehttps://bugs.python.org/issue14243)。

您需要使用 delete=False 并手动清理,例如

try:
    with NamedTemporaryFile(suffix=".xlsx",mode='w+',delete=True) as tmp:
       temp_name = fp.name
       # ...
finally:
    try:
        os.unlink(temp_name)
    except Exception:
        pass