【问题标题】:How to eliminate absolute path in zip archive if absolute paths for files are provided?python/zip:如果提供了文件的绝对路径,如何消除 zip 存档中的绝对路径?
【发布时间】:2013-04-12 02:18:38
【问题描述】:

我在两个不同的目录中有两个文件,一个是'/home/test/first/first.pdf',另一个是'/home/text/second/second.pdf'。我使用以下代码来压缩它们:

import zipfile, StringIO
buffer = StringIO.StringIO()
first_path = '/home/test/first/first.pdf'
second_path = '/home/text/second/second.pdf'
zip = zipfile.ZipFile(buffer, 'w')
zip.write(first_path)
zip.write(second_path)
zip.close()

打开我创建的 zip 文件后,里面有一个 home 文件夹,里面有两个子文件夹 firstsecond,然后是 pdf 文件。我不知道如何仅包含两个 pdf 文件,而不是将完整路径压缩到 zip 存档中。我希望我把我的问题说清楚,请帮忙。谢谢。

【问题讨论】:

    标签: python zip absolute-path zipfile


    【解决方案1】:

    我怀疑可能有更优雅的解决方案,但这个应该可以工作:

    def add_zip_flat(zip, filename):
        dir, base_filename = os.path.split(filename)
        os.chdir(dir)
        zip.write(base_filename)
    
    zip = zipfile.ZipFile(buffer, 'w')
    add_zip_flat(zip, first_path)
    add_zip_flat(zip, second_path)
    zip.close()
    

    【讨论】:

      【解决方案2】:

      zipfile write() 方法支持一个额外的参数 (arcname),它是要存储在 zip 文件中的存档名称,因此您只需更改代码:

      from os.path import basename
      ...
      zip.write(first_path, basename(first_path))
      zip.write(second_path, basename(second_path))
      zip.close()
      

      当您有空闲时间阅读zipfile 的文档时会有所帮助。

      【讨论】:

      【解决方案3】:

      我使用这个函数来压缩一个不包含绝对路径的目录

      import zipfile
      import os 
      def zipDir(dirPath, zipPath):
          zipf = zipfile.ZipFile(zipPath , mode='w')
          lenDirPath = len(dirPath)
          for root, _ , files in os.walk(dirPath):
              for file in files:
                  filePath = os.path.join(root, file)
                  zipf.write(filePath , filePath[lenDirPath :] )
          zipf.close()
      #end zipDir
      

      【讨论】:

        【解决方案4】:

        也可以这样做(这允许创建 >2GB 的档案)

        import os, zipfile
        def zipdir(path, ziph):
            """zipper"""
            for root, _, files in os.walk(path):
                for file_found in files:
                    abs_path = root+'/'+file_found
                    ziph.write(abs_path, file_found)
        zipf = zipfile.ZipFile(DEST_FILE.zip, 'w', zipfile.ZIP_DEFLATED, allowZip64=True)
        zipdir(SOURCE_DIR, zipf)
        zipf.close()
        

        【讨论】:

          【解决方案5】:

          您可以使用arcname 参数覆盖存档中的文件名:

          with zipfile.ZipFile(file="sample.zip", mode="w", compression=zipfile.ZIP_DEFLATED) as out_zip:
          for f in Path.home().glob("**/*.txt"):
              out_zip.write(f, arcname=f.name)
          

          文档参考:https://docs.python.org/3/library/zipfile.html#zipfile.ZipFile.write

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-08-17
            • 2021-10-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多