压缩目录目标

Gra*_*GTO 5 python python-2.6 file-handling

我在 Python 2.6 中使用这个基本脚本来压缩目录:

def zipdir(path, ziph):
    import os, zipfile
    for(dir, _, files) in os.walk(path):
        for file in files:
            ziph.write(os.path.join(dir, file))

ziph = zipfile.ZipFile(name + '.zip', 'w', zipfile.ZIP_DEFLATED)
path = 'c:/test/directory'
Run Code Online (Sandbox Code Playgroud)

问题出在我的新 zip 文件中。

例如,我要压缩的目标文件夹位于c:/test/directory/myfiles

所以当我压缩它时,而不是得到:file.zip/directory/myfiles,

我有 :file.zip/test/directory/myfiles

我不想保留“test”文件夹。

有人可以告诉我如何解决它吗?

tst*_*357 2

在 python 2.7 或更高版本中:

\n\n

尝试使用“shutil”包

\n\n
import shutil\nimport os\n\nzip_path = \'c:/test/new_zip_file\'\ntarget_dir_path = \'c:/test/directory\'\n\n# such as "c:/test/"\nparent_target_dir_path = os.path.dirname(target_dir_path)\n# such as "directory"\ntarget_dir_name = os.path.basename(target_dir_path)\n\nshutil.make_archive(zip_path, \'zip\', root_dir=parent_target_dir_path, base_dir=target_dir_name)\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果 :

\n\n
new_zip_file.zip\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 directory\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 myfile1\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 myfile2\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 myfile3 ...\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

编辑

\n\n

在Python 2.6中:

\n\n
import zipfile\n\ndef zipdir(path, ziph):\n    import os, zipfile\n    parent_dir_name = os.path.basename(path)\n    for(dir, _, files) in os.walk(path):\n        for file in files:\n            path_in_zip = dir[dir.find(parent_dir_name):]\n            ziph.write(os.path.join(dir, file) , arcname = path_in_zip+"/"+file)\n\nname = "ziptest"\n\nziph = zipfile.ZipFile(name + \'.zip\', \'w\', zipfile.ZIP_DEFLATED)\npath = \'c:/test/directory\'\n\nzipdir(path, ziph)\n
Run Code Online (Sandbox Code Playgroud)\n\n

它使用参数arcname并指定 in-zip-path。
\n例如,ziph.write("c:/test/directory/myfile1" , arcname = "dirctory/myfile1") 制作一个 zip 文件,例如ziptest.zip/dirctory/myfile1

\n