<p>首先,您不需要创建一个<code>NamedTemporaryFile</code>来使用<code>make_archive</code>;您只需要为要创建的<code>make_archive</code>文件创建一个唯一的文件名。</p>
<h2><code>.write</code>不返回文件名</h2>
<p>要关注这个错误:假设<code>f.write</code>的返回值是一个可以打开的文件名;只需查找文件的开头并读取:</p>
<pre><code>f.write(make_archive(f.name, 'zip', root_dir))
f.seek(0)
data = f.read()
</code></pre>
<p>注意,您还需要清除创建的临时文件(您设置了<code>delete=False</code>):</p>
<pre><code>import os
f.close()
os.unlink(f.name)
</code></pre>
<p>或者,只需省略<code>delete</code>关键字,使其再次默认为<code>True</code>,然后只关闭文件,无需取消链接。</p>
<h2>刚刚将存档文件名写入一个新文件</h2>
<p>您正在将新的存档文件名写入临时文件。你最好直接阅读档案:</p>
<pre><code>data = open(make_archive(f.name, 'zip', root_dir), 'rb').read()
</code></pre>
<p>注意,现在您的临时文件根本不会被写入。</p>
<h2>最好的方法</h2>
<p>避免创建一个<code>NamedTemporaryFile</code>完全:请使用<a href="http://docs.python.org/library/tempfile.html#tempfile.mkdtemp" rel="noreferrer">^{<cd10>}</a>来生成一个临时目录,将您的归档文件放在其中,然后再将其清除:</p>
<pre><code>tmpdir = tempfile.mkdtemp()
try:
tmparchive = os.path.join(tmpdir, 'archive')
root_dir = "something"
data = open(make_archive(tmparchive, 'zip', root_dir), 'rb').read()
finally:
shutil.rmtree(tmpdir)
</code></pre>