命名临时文件未被删除



我正在lambda函数中创建一个命名的临时文件,我认为我编写的代码可能存在问题。

我创建了一个命名文件,用于创建一个excel文件,然后我将命名文件引用传递给另一个函数以上传到bucket,似乎该函数的进一步调用最终导致磁盘满。

我不完全确定为什么调用close()不会从磁盘上的任何地方删除文件。

下面是创建excel文件的函数:
def get_excel_file(df_report): 
    tmp_file = tempfile.NamedTemporaryFile(suffix=".xlsx")
    
    with pd.ExcelWriter(tmp_file.name) as writer:       
        df_report.to_excel(
            writer, sheet_name="Report", index=False, startrow=4
        )
        writer.save()
    return tmp_file

返回的文件tmp_file然后被传递到下面的函数中进行上传,如果参数名为report:

def upload_renewal_report(bucket_name, report, file_name):    
    s3_client.upload_file(report.name, bucket_name, file_name)
    report.close()

是否有什么明显的错误的代码,这意味着文件没有得到清理?

报告,我关闭的对象输出为:

WHAT IS REPORT: <tempfile._TemporaryFileWrapper object at 0x7f9aeb9d42e0>
WHAT TYPE IS REPORT: <class 'tempfile._TemporaryFileWrapper'>

有一个已经被删除的注释,它似乎暗示我没有在临时文件上调用close。我确实调用了close()似乎是临时文件,但似乎在上传到S3后,由于某种原因,文件已经关闭了。也许有一些东西,因为我直到现在才在日志中看到这个:

/opt/python/xlsxwriter/workbook.py:338: UserWarning: Calling close() on already closed file.

NamedTemporaryFile可能有些奇怪。我有一个测试,在linux上工作,但不是与你描述的确切行为的窗口。我修改了-

with NamedTemporaryFile(mode="w", delete=False) as f:
    f.write(profile)
    f.seek(0)
    yield f.name
    f.close()
    os.unlink(f.name)

您也可能实际上不需要使用磁盘(如果文件对内存来说不是太大)

data = io.BinaryIO()
with pd.ExcelWriter(data) as writer:       
    df_report.to_excel(
        writer, sheet_name="Report", index=False, startrow=4
    )
s3_client.put_object(Body=data)

最新更新