单文件压缩

28

我正在尝试在Python中压缩单个文件。出于某些原因,我很难掌握语法。我想要做的是保留原始文件并创建一个原始文件的新压缩文件(就像Mac或Windows如果你归档一个文件那样所做的)。

到目前为止,这是我所拥有的:

import zipfile

myfilepath = '/tmp/%s' % self.file_name
myzippath = myfilepath.replace('.xml', '.zip')

zipfile.ZipFile(myzippath, 'w').write(open(myfilepath).read()) # does not zip the file properly

3
你遇到了什么错误? - Rishi Dua
2
zipfile.write() 的第一个参数应该是现有文件的名称,但你却将文件内容作为文件名传递。你需要传递源文件的名称(同时加上 arcname=),或者使用 writestr() 方法。 - dhke
1
ZipFile.write(filename, arcname=None, compress_type=None) 将名为filename的文件写入存档,并给它一个存档名称arcname。 - Haifeng Zhang
2
为了“正确地”压缩文件,您可能需要添加compress_type=zipfile.ZIP_DEFLATED,因为zipfile默认压缩是ZIP_STORED,这不会减小压缩文件的大小。 - Vimanyu
4个回答

28

压缩文件的正确方法是:

zipfile.ZipFile('hello.zip', mode='w').write("hello.csv")
# assume your xxx.py under the same dir with hello.csv

Python官方文档写道:

ZipFile.write(filename, arcname=None, compress_type=None)

将名为filename的文件写入归档文件,并赋予它名称arcname。

你需要将open(filename).read()传给write()open(filename).read()是一个包含文件filename全部内容的字符串,如果这个字符串被当作文件名使用,则会引发FileNotFoundError错误。


2
compress_type 的有效值包括 zipfile.ZIP_STORED(未压缩)、zipfile.ZIP_DEFLATED(标准 ZIP)、以及自解释的 zipfile.ZIP_BZIP2zipfile.ZIP_LZMA - BallpointBen
1
文件描述符是否可能保持打开状态?使用with-as语句可以更好地帮助解决这个问题。确保您使用.close()关闭描述符。正确的答案可能是@nbeuchat提供的答案。 - José Cabo

26

如果需要压缩的文件(filename)位于名为pathname的不同目录中,则应使用arcname参数。否则,它将重新创建完整的文件夹层次结构到文件夹。

from zipfile import ZipFile
import os

with ZipFile(zip_file, 'w') as zipf:
    zipf.write(os.path.join(pathname,filename), arcname=filename)

在你的例子中,zip_file 是从哪里来的 - 它是要创建的 zip 文件的期望名称吗? - Adam Smooch
@AdamSmooch 没错,名称和可选路径。 - nbeuchat

9
尝试在之后调用zipfile.close()?
   from zipfile import ZipFile
   zipf = ZipFile("main.zip","w", zipfile.ZIP_DEFLATED)
   zipf.write("main.json")

   zipf.close()

5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接