zip文件并避免目录结构

use*_*851 21 python zip

我有一个拉链文件(new.txt)的Python脚本.

tofile =  "/root/files/result/"+file
targetzipfile = new.zip   # This is how I want my zip to look like
zf = zipfile.ZipFile(targetzipfile, mode='w')
try:
    #adding to archive
    zf.write(tofile)
finally:
    zf.close()
Run Code Online (Sandbox Code Playgroud)

当我这样做时,我得到了zip文件.但是当我尝试解压缩文件时,我得到的文件文件位于与文件路径对应的一系列目录中,即我看到目录root中有一个文件夹result,里面有更多目录,即我有

/root/files/result/new.zip

当我解压缩时,new.zip我有一个看起来像的目录结构

/root/files/result/root/files/result/new.txt.
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以拉链,这样当我解压缩时我才会得到new.txt.

换句话说,我有/root/files/result/new.zip,当我解压缩时new.zip,它应该看起来像

/root/files/results/new.txt
Run Code Online (Sandbox Code Playgroud)

use*_*321 33

zipfile.write()方法采用一个可选arcname参数,指定zipfile中文件的名称

我认为您需要对目标进行修改,否则它将复制目录.使用:arcname避免它.试试这样:

import os
import zipfile

def zip(src, dst):
    zf = zipfile.ZipFile("%s.zip" % (dst), "w", zipfile.ZIP_DEFLATED)
    abs_src = os.path.abspath(src)
    for dirname, subdirs, files in os.walk(src):
        for filename in files:
            absname = os.path.abspath(os.path.join(dirname, filename))
            arcname = absname[len(abs_src) + 1:]
            print 'zipping %s as %s' % (os.path.join(dirname, filename),
                                        arcname)
            zf.write(absname, arcname)
    zf.close()

zip("src", "dst")
Run Code Online (Sandbox Code Playgroud)


Wil*_* R. 11

为了最清楚地说明,

目录结构:

/Users
 ??? /user
 .    ??? /pixmaps
 .    ?    ??? pixmap_00.raw
 .    ?    ??? pixmap_01.raw
      ?    ??? /jpeg
      ?    ?    ??? pixmap_00.jpg
      ?    ?    ??? pixmap_01.jpg
      ?    ??? /png
      ?         ??? pixmap_00.png
      ?         ??? pixmap_01.png
      ??? /docs
      ??? /programs
      ??? /misc
      .
      .
      .
Run Code Online (Sandbox Code Playgroud)

感兴趣的目录:/Users/user/pixmaps

第一次尝试

import os
import zipfile

TARGET_DIRECTORY = "/Users/user/pixmaps"
ZIPFILE_NAME = "CompressedDir.zip"

def zip_dir(directory, zipname):
    """
    Compress a directory (ZIP file).
    """
    if os.path.exists(directory):
        outZipFile = zipfile.ZipFile(zipname, 'w', zipfile.ZIP_DEFLATED)

        for dirpath, dirnames, filenames in os.walk(directory):
            for filename in filenames:

                filepath   = os.path.join(dirpath, filename)
                outZipFile.write(filepath)

        outZipFile.close()




if __name__ == '__main__':
    zip_dir(TARGET_DIRECTORY, ZIPFILE_NAME)
Run Code Online (Sandbox Code Playgroud)

ZIP文件结构:

CompressedDir.zip
.
??? /Users
     ??? /user
          ??? /pixmaps
               ??? pixmap_00.raw
               ??? pixmap_01.raw
               ??? /jpeg
               ?    ??? pixmap_00.jpg
               ?    ??? pixmap_01.jpg
               ??? /png
                    ??? pixmap_00.png
                    ??? pixmap_01.png
Run Code Online (Sandbox Code Playgroud)

避免完整目录路径

def zip_dir(directory, zipname):
    """
    Compress a directory (ZIP file).
    """
    if os.path.exists(directory):
        outZipFile = zipfile.ZipFile(zipname, 'w', zipfile.ZIP_DEFLATED)

        # The root directory within the ZIP file.
        rootdir = os.path.basename(directory)

        for dirpath, dirnames, filenames in os.walk(directory):
            for filename in filenames:

                # Write the file named filename to the archive,
                # giving it the archive name 'arcname'.
                filepath   = os.path.join(dirpath, filename)
                parentpath = os.path.relpath(filepath, directory)
                arcname    = os.path.join(rootdir, parentpath)

                outZipFile.write(filepath, arcname)

    outZipFile.close()




if __name__ == '__main__':
    zip_dir(TARGET_DIRECTORY, ZIPFILE_NAME)
Run Code Online (Sandbox Code Playgroud)

ZIP文件结构:

CompressedDir.zip
.
??? /pixmaps
     ??? pixmap_00.raw
     ??? pixmap_01.raw
     ??? /jpeg
     ?    ??? pixmap_00.jpg
     ?    ??? pixmap_01.jpg
     ??? /png
          ??? pixmap_00.png
          ??? pixmap_01.png
Run Code Online (Sandbox Code Playgroud)


小智 11

write 方法中的参数arcname指定 zip 文件内的文件名:

import os
import zipfile

# 1. Create a zip file which we will write files to
zip_file = "/home/username/test.zip"
zipf = zipfile.ZipFile(zip_file, 'w', zipfile.ZIP_DEFLATED)

# 2. Write files found in "/home/username/files/" to the test.zip
files_to_zip = "/home/username/files/"
for file_to_zip in os.listdir(files_to_zip):

    file_to_zip_full_path = os.path.join(files_to_zip, file_to_zip)

    # arcname argument specifies what will be the name of the file inside the zipfile
    zipf.write(filename=file_to_zip_full_path, arcname=file_to_zip)

zipf.close()
Run Code Online (Sandbox Code Playgroud)

  • 在所有答案中,你的答案是最简单的,很快我就明白了。谢谢! (2认同)

jin*_*nzy 8

zf.write(tofile)
Run Code Online (Sandbox Code Playgroud)

改变

zf.write(tofile, zipfile_dir)
Run Code Online (Sandbox Code Playgroud)

例如

zf.write("/root/files/result/root/files/result/new.txt", "/root/files/results/new.txt")
Run Code Online (Sandbox Code Playgroud)


Hel*_*eer 6

您可以使用以下方法仅隔离源文件的文件名:

name_file_only= name_full_path.split(os.sep)[-1]
Run Code Online (Sandbox Code Playgroud)

例如,如果name_full_path/root/files/results/myfile.txt,那么name_file_only将会是myfile.txt。要将 myfile.txt 压缩到存档的根目录zf,您可以使用:

zf.write(name_full_path, name_file_only)
Run Code Online (Sandbox Code Playgroud)


aqu*_*lah 5

查看Zipfile.write的文档。

ZipFile.write(filename[, arcname[, compress_type]]) 将名为 filename 的文件写入存档,为其指定存档名称 arcname(默认情况下,这将与 filename 相同,但没有驱动器号和前导路径删除了分隔符)

https://docs.python.org/2/library/zipfile.html#zipfile.ZipFile.write

请尝试以下操作:

import zipfile
import os
filename = 'foo.txt'

# Using os.path.join is better than using '/' it is OS agnostic
path = os.path.join(os.path.sep, 'tmp', 'bar', 'baz', filename)
zip_filename = os.path.splitext(filename)[0] + '.zip'
zip_path = os.path.join(os.path.dirname(path), zip_filename)

# If you need exception handling wrap this in a try/except block
with zipfile.ZipFile(zip_path, 'w') as zf:
    zf.write(path, zip_filename)
Run Code Online (Sandbox Code Playgroud)

最重要的是,如果您不提供存档名称,则文件名将用作存档名称,它将包含文件的完整路径。


Cam*_*ilo 5

它比预期简单得多,我使用参数“arcname”将模块配置为“file_to_be_zipped.txt”,因此这些文件夹不会出现在我的最终压缩文件中:

mmpk_zip_file = zipfile.ZipFile("c:\\Destination_folder_name\newzippedfilename.zip", mode='w', compression=zipfile.ZIP_DEFLATED)
mmpk_zip_file.write("c:\\Source_folder_name\file_to_be_zipped.txt", "file_to_be_zipped.txt")
mmpk_zip_file.close()
Run Code Online (Sandbox Code Playgroud)