【问题标题】:Zip single file压缩单个文件
【发布时间】:2017-07-02 01:08:45
【问题描述】:

我正在尝试在 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

【问题讨论】:

  • 你得到什么错误?
  • zipfile.write() 将现有文件的名称作为第一个参数,您将文件的内容作为文件名传递。您要么想要传递源文件的名称(连同arcname=),要么正在寻找writestr()
  • ZipFile.write(filename, arcname=None, compress_type=None) 将名为 filename 的文件写入存档,并为其赋予存档名称 arcname
  • 为了“正确”压缩文件,您可能需要添加compress_type=zipfile.ZIP_DEFLATED,因为压缩文件默认压缩为ZIP_STORED,这不会减少压缩文件的大小。

标签: python zipfile


【解决方案1】:

如果要压缩的文件 (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)

【讨论】:

    【解决方案2】:

    正确的压缩方式是:

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

    python官方文档says:

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

    将名为 filename 的文件写入存档,并将存档名称命名为 arcname

    您将open(filename).read() 传递给write()open(filename).read() 是包含文件filename 全部内容的单个字符串,它会抛出FileNotFoundError,因为它正在尝试查找以字符串内容命名的文件。

    【讨论】:

    • compress_type 的有效值是 zipfile.ZIP_STORED(未压缩)、zipfile.ZIP_DEFLATED(标准 ZIP)和 zipfile.ZIP_BZIP2zipfile.ZIP_LZMA,它们是不言自明的。
    【解决方案3】:

    由于您还想指定目录,请尝试使用os.chdir

    #!/usr/bin/python
    
    from zipfile import ZipFile
    import os
    
    os.chdir('/path/of/target/and/destination')
    ZipFile('archive.zip', 'w').write('original_file.txt')
    

    【讨论】:

      【解决方案4】:

      之后尝试调用 zipfile.close() 吗?

         from zipfile import ZipFile
         zipf = ZipFile("main.zip","w", zipfile.ZIP_DEFLATED)
         zipf.write("main.json")
      
         zipf.close()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-09-22
        • 2021-07-03
        • 2021-10-16
        • 1970-01-01
        • 2020-02-09
        • 2021-03-22
        • 2017-03-15
        相关资源
        最近更新 更多