从临时文件用xlsxwriter打开Excel输出失败

1 投票
1 回答
4933 浏览
提问于 2025-04-18 12:46

我正在使用 xlsxwriter 创建一个 xlsx 格式的输出文件,并把它存储在一个临时文件里,这个临时文件是通过 tempfile 模块生成的。我把这个临时文件的路径存储在一个变量里,稍后在另一个脚本中用这个变量来打开它。

问题是,有时候打开这个文件会失败,并出现错误:

"[Errno 2] No such file or directory: '/tmp/xls5TnVsx'" 

抱歉,我不太清楚这个问题发生的频率,但似乎时不时会出现,所以我不明白为什么会这样……

这是我如何保存到临时文件的:

f = tempfile.NamedTemporaryFile(prefix="xls",delete=False)
xlsfilename = f.name  

然后我用这个方法来创建 xlsx 输出:

wb = xlsxwriter.Workbook(filename)
ws = wb.add_worksheet(sheetName)
# Write header
....
# Write data
for row, row_data in enumerate(data, start=1):
    for column, key in enumerate(headers):
        ....
wb.close()
f.close()

接着在一个 Python CGI 脚本中,我使用变量 xlsxfilename,它是指向脚本的路径,用来打开这个文件:

print "Content-type: application/msexcel"
print "Content-Disposition: attachment; filename="+xlsfilename
print
try :
    print open(xlsfilename,"rb").read()
finally:
    try:
        xlsfilename.close()
    except:
        pass

os.unlink(xlsfilename)

我在这里做错了什么?有没有什么想法可以通过其他方法来存储到临时文件中解决这个问题?

1 个回答

2

我觉得这里的问题是,你的程序把自己生成的输出写到了已经创建的文件里,导致文件被覆盖了,因为

wb = xlsxwriter.Workbook(filename)

这条语句会创建一个新文件。这个文件什么时候会被删除,取决于你什么时候删除这个临时文件(技术上来说,这个删除是在 close() 时发生的)。

你可以考虑使用 mkstemp,因为你已经明确地删除了你创建的文件。覆盖那个文件是可以控制的,因为它的名字是唯一的,并且不会自动删除。

撰写回答