Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么压缩输出更大的zip文件_Python_File_Zip_Compression - Fatal编程技术网

Python 为什么压缩输出更大的zip文件

Python 为什么压缩输出更大的zip文件,python,file,zip,compression,Python,File,Zip,Compression,我真的不理解python压缩,因为每当我试图压缩一个文件夹或文件时,我最终得到一个比原始文件大5.5倍的非常大的文件。为什么会发生这种情况?有没有什么方法可以用python压缩文件夹或文件,并获得最大为原始文件大小的输出?这是我正在使用的代码 import os, zipfile def zipfiles(filename, destname): try: zf = zipfile.ZipFile(destname, 'w', zipfile.ZIP_DEFLATED) for

我真的不理解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()

确保目标
.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 destination file.
                        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()

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