一、需求说明
由于处理的是 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)