11

我需要使用 python 压缩一个包含 .xml 文件和 .fgdb 文件的文件夹。有人可以帮我吗?我尝试了一些在互联网上找到的脚本,但总是存在一些技术问题(例如创建一个空的 zip 文件,或者创建 zip 文件我无法打开“无权限”等。)

提前致谢。

4

3 回答 3

22

让它发挥作用的关键是os.walk()功能。这是我过去组装的一个应该可以工作的脚本。如果你有任何例外,请告诉我。

import zipfile
import os
import sys

def zipfolder(foldername, target_dir):            
    zipobj = zipfile.ZipFile(foldername + '.zip', 'w', zipfile.ZIP_DEFLATED)
    rootlen = len(target_dir) + 1
    for base, dirs, files in os.walk(target_dir):
        for file in files:
            fn = os.path.join(base, file)
            zipobj.write(fn, fn[rootlen:])

zipfolder('thenameofthezipfile', 'thedirectorytobezipped') #insert your variables here
sys.exit()
于 2012-05-07T09:51:58.657 回答
2

这个答案非常有帮助,但我花了一点时间才完全理解rootlen它的用途。这个例子使用一些更长的变量名来帮助说明这里到底发生了什么。还包括一个用于验证 zip 文件是否正确的块。

import os
import zipfile

src_path = os.path.join('/', 'some', 'src', 'path')
archive_name = 'myZipFile.zip'
archive_path = os.path.join('/', 'some', 'path', archive_name)

with zipfile.ZipFile(archive_path, 'w', zipfile.ZIP_DEFLATED) as archive_file:
    for dirpath, dirnames, filenames in os.walk(src_path):
        for filename in filenames:
            file_path = os.path.join(dirpath, filename)
            archive_file_path = os.path.relpath(file_path, src_path)
            archive_file.write(file_path, archive_file_path)

with zipfile.ZipFile(archive_path, 'r') as archive_file:
    bad_file = zipfile.ZipFile.testzip(archive_file)

    if bad_file:
        raise zipfile.BadZipFile(
            'CRC check failed for {} with file {}'.format(archive_path, bad_file))
于 2019-11-29T22:17:01.440 回答
0

如果有人想要在您的项目中使用一些通用功能

def zip_compression_tree(root_path, zip_name):
with zipfile.ZipFile(zip_name, 'w') as z:
    for root, dirs, files in os.walk(root):
        for file in files:
            z.write(os.path.join(root, file))
        for directory in dirs:
            z.write(os.path.join(root, directory))
于 2021-03-30T15:10:11.137 回答