【问题标题】:Why does compression output a larger zip file?为什么压缩会输出更大的 zip 文件?
【发布时间】:2015-11-25 01:18:38
【问题描述】:

我真的不了解 python 压缩,因为每当我尝试压缩文件夹或文件时,我最终会得到一个比原始文件大 5.5 倍的非常大的文件。为什么会这样?有什么方法可以用python压缩文件夹或文件并获得最多为原始文件大小的输出?这是我正在使用的代码。

import os, zipfile

def zipfiles(filename, destname):
  try:
   zf = zipfile.ZipFile(destname, 'w', zipfile.ZIP_DEFLATED)
   for dirname, subdirs, files in os.walk(filename):
      zf.write(dirname)
      for filename in files:
          zf.write(os.path.join(dirname, filename))
   zf.close()
  except Exception, e:
   print str(e)
def main():
   x = raw_input('Enter Filename:   ')
   while len(x) == 0:
       x = raw_input('Enter Filename:   ')
   y = raw_input('Enter destination name:   ')
   while len(y) == 0:
       y = raw_input('Enter destination name:   ')
   zipfiles(x, y+'.zip')
main()

【问题讨论】:

  • 您如何比较尺寸?如果您使用zipfile.ZIP_STORED 而不是ZIP_DEFLATED,您应该可以直接比较。另外,您的数据集有多大?
  • 你压缩什么文件?许多小的?
  • 我有一些项目的 java 文件夹。我想将该文件夹发送给我的朋友,因此它应该被压缩,它的大小是 2.6Mb,但压缩后得到 11.4Mb
  • 我尝试了“zipfile.ZIP_STORED”,现在它变得疯狂到 27.7Mb
  • 不确定您为什么要这样做,但请尝试删除 zf.write(dirname)

标签: python file zip compression


【解决方案1】:

确保目标 .zip 文件不在您正在压缩的文件夹中,否则您的脚本可能会将正在创建的文件的副本添加到自身 — 这显然会使文件变得更大。

这是您的代码的修订版本,当它在同一目录文件夹中创建时将跳过存档:

import os, zipfile

def zipfiles(source_folder, destination_name):
    source_folder = os.path.abspath(source_folder)
    destination_path = os.path.abspath(destination_name)
    try:
        with zipfile.ZipFile(destination_name, 'w', zipfile.ZIP_DEFLATED) as zf:
            for dirname, subdirs, files in os.walk(source_folder):
                # zf.write(dirname)  # Not needed.
                for filename in files:
                    filepath = os.path.join(dirname, filename)
                    if filepath != destination_path:  # Skip file being created.
                        zf.write(filepath)
    except Exception as e:
        print(e)

def main():
    x = ''
    while not x:
        x = raw_input('Enter source folder name: ')
    y = ''
    while not y:
        y = raw_input('Enter destination archive file name: ')
    zipfiles(x, y+'.zip')

main()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多