压缩所有所需文件内容的ZipFile脚本

时间:2020-01-13 19:14:35

标签: python zipfile

因此,我正在处理一个脚本,该脚本需要将所有文件压缩到一个共享相同名称的文件夹中。因此,例如,文件夹结构如下所示。

001.flt
001.hdr
001.prj
002.flt
002.hdr
002.prj

。 。

700.flt
700.hdr
700.prj

为了获得要压缩的文件,我有一个可以处理单个文件但不能识别["*.flt", "*.hdr", "*.prj"]

的脚本。

是否有一种变通方法,可让脚本根据文件名识别文件名并按名称对文件进行分组?我希望每个单独的zip文件都包含文件内容,但将其压缩为 001.zip,002.zip ....

表示zip文件包含不同的文件扩展名

001.zip( 001.hdr, 001.prj, 001.flt )

'''

import zipfile, sys, os, glob 


inDir = r"\test\DEM"
outDir = r"\test\DEM_out"  
filetype = "*.flt"

def zipfiletypeInDir(inDir, outDir):  
    # Check that input directory exists  
    if not os.path.exists(inDir):  
        print ("Input directory %s does not exist!" % inDir) 
        return False  

    print ("Zipping filetype(s) in folder %s to output folder %s" % (inDir, outDir))

    # Loop through "filetype" in input directory, glob will match pathnames from 
    for inShp in glob.glob(os.path.join(inDir, filetype)):  
        # Build the filename of the output zip file  
        outZip = os.path.join(outDir, os.path.splitext(os.path.basename(inShp))[0] + ".zip")  

        # Zip the "filetype"  
        zipfiletype(inShp, outZip)  
    return True  

def zipfiletype(infiletype, newZipFN):  
    print ('Starting to Zip '+(infiletype)+' to '+(newZipFN))

    # Delete output zipfile if it already exists  
    if (os.path.exists(newZipFN)):  
        print ('Deleting'+ newZipFN)
        os.remove(newZipFN)  

    # Output zipfile still exists, exit  
    if (os.path.exists(newZipFN)):  
        print ('Unable to Delete'+newZipFN)
        return False  

    # Open zip file object
    zipobj = zipfile.ZipFile(newZipFN,'w')  

    # Loop through "filetype" components  
    for infile in glob.glob( infiletype.lower().replace(filetype,"*.flt")):  
        # Skip .zip file extension  
        if os.path.splitext(infile)[1].lower() != ".zip":  
            print ("Zipping %s" % (infile)) 
            # Zip the "filetype" component  
            zipobj.write(infile,os.path.basename(infile),zipfile.ZIP_DEFLATED)  


    zipobj.close()  
    return True  


if __name__=="__main__":  


    zipfiletypeInDir(inDir, outDir)  
    print ("done!")

2 个答案:

答案 0 :(得分:0)

如果我提供的可能重复项没有回答您的问题...。

一种方法是遍历所有文件名,并创建一个字典,将所有具有相同名称的文件分组。

In [54]: import collections, os, zipfile
In [55]: zips = collections.defaultdict(list)
In [55]: 
In [56]: for f in os.listdir():
    ...:     name, ext = os.path.splitext(f)
    ...:     zips[name].append(f)

然后遍历字典;为每个密钥创建一个新的zip文件,并将每个密钥的文件添加到其中。

In [57]: outdir = r'zips'

In [58]: for k,v in zips.items():
    ...:     zname = k+'.zip'
    ...:     fpath = os.path.join(outdir,zname)
    ...:     #print(fpath)
    ...:     with zipfile.ZipFile(fpath, 'w') as z:
    ...:         for name in v:
    ...:             z.write(name)

答案 1 :(得分:0)

我找到了想要的东西,该脚本标识了文件的名称,并根据其与Iterator进行了分组。

#group files into separate zipfolders from single directory based from
#individual file names 

import fnmatch, os, glob, zipfile

#edit data folders for in and out variables
path = r"D:\Users\in_path"
out_path = D"C:\Users\out_path"   

#create variables used in iterator
obj = os.listdir(path)
my_iterator = obj.__iter__()
##
#iterate each file name as '%s.*' 
for obj in my_iterator:

    #define name of file for rest of iterator to preform
    name = os.path.splitext(obj)[0]
    print (name)

    #create a zip folder to store data that is being compressed
    zip_path = os.path.join(out_path, name + '.zip')

    #create variable 'zip' that directs the data into the compressed folder
    zip = zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED)
    os.chdir(path)

    #files are written to the folder with glob.glob
    for files in glob.glob('%s.*' %name):
        zip.write(os.path.join(path,files), files)

    #print each iteration of files being written
    print ('All files written to %s' %zip_path)
    zip.close()
相关问题