(脚本)在Python中使用zipfile根据名称压缩文件夹里面的文件(将名称相同,扩展名不同的压缩成一个包)

一、需求说明

由于处理的是 GIS 类数据,需要将每个图层的数据进行压缩再上传到一个系统中。每个图层的数据是由名称相同,扩展名不同的六个或七个文件组成,如下图所示:

需要处理成如下所示:

二、代码

直接上代码,代码中有注释

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import zipfile

input_path = "F:/d3/土地利用总体规划"    #文件输入路径
output_path =  "F:/d3/土地利用总体规划"   #文件输出路径

def readFilename(path, allfile):
    files = os.listdir(path)
    for file in files:
        if os.path.isdir(path + '/' + file):
            readFilename(path + '/' + file, allfile)
        else:
            allfile.append(path + '/' + file)

def saveZip(input_path, output_path):
    filelists = []  # filelists里面存放的是所有文件的列表
    readFilename(input_path, filelists)  #读取文件列表
    for num in range(len(filelists)):  #注意num是0到(len-1)的值
        filename = filelists[num].split(".")[0].split("/")[-1]  # 数据名称本身,如市级行政区,不包括扩展名
        output_name = filename + '.zip'  # 输出文件名及格式
        filename_exten = filelists[num].split("/")[-1]  # 文件名(包括扩展名),如市级行政区.dbf,为以后数据写入压缩包做准备
        if num == 0:  # 当是第一个时
            filename_pre = 0
        else:
            filename_pre = filelists[num - 1].split(".")[0].split("/")[-1]   #上一个数据名,不包括扩展名
        if (filename == filename_pre) or ( filename_pre == 0):  #当这个数据等于它的上一个数据或者当这个数据为第一个数据时
            if num==0:  #当是第一个数据时
                f = zipfile.ZipFile(output_path + '/' + output_name, 'w', zipfile.ZIP_DEFLATED)  # 文件压缩定义
            f.write(filelists[num],filename_exten)  #将文件压缩,其中需要写成两个参数的样式,防止压缩包里面的文件有多个层级路径
            num += 1
            continue    #当该文件与它上一个文件名相同或是第一个文件时,直接进行下一次循环
        f.close()  #需要结束上一次压缩,从而可以进行下一次压缩
        f = zipfile.ZipFile(output_path + '/' + output_name, 'w', zipfile.ZIP_DEFLATED)  # 文件压缩定义
        f.write(filelists[num], filename_exten)

    f.close()

if __name__ == '__main__':
    saveZip(input_path,output_path)

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值