【问题标题】:How to add files from multiple zip files into the single zip file如何将多个 zip 文件中的文件添加到单个 zip 文件中
【发布时间】:2019-11-07 22:14:49
【问题描述】:

我想将具有公共子字符串的多个 zip 文件中的文件放入一个 zipfile 中

我有一个文件夹“temp”,其中包含一些 .zip 文件和一些其他文件

filename1_160645.zip
filename1_165056.zip
filename1_195326.zip
filename2_120528.zip
filename2_125518.zip
filename3_171518.zip
test.xlsx
filename19_161518.zip

我有以下包含文件名前缀的数据框 df_filenames

filename_prefix

filename1
filename2
filename3

如果临时文件夹中有多个 .zip 文件,其前缀与数据框 df_filenames 中存在的相同前缀,我想合并这些文件的内容

例如filename1_160645.zip包含以下内容

1a.csv
1b.csv

filename1_165056.zip 包含以下内容

1d.csv

filename1_195326.zip 包含以下内容

1f.csv

将以上2个文件的内容合并到filename1_160645.zipfilename1_160645.zip 的内容将是

1a.csv
1b.csv
1d.csv
1f.csv

最后只有以下文件将保留临时文件夹

filename1_160645.zip
filename2_120528.zip
filename3_171518.zip
test.xlsx
filename19_161518.zip

我已经写了以下代码,但它不起作用


import os
import zipfile as zf
import pandas as pd

df_filenames=pd.read_excel('filename_prefix.xlsx')
#Get the list of all the filenames in the temp folder
lst_fnames=os.listdir(r'C:\Users\XYZ\Downloads\temp')
#take only .zip files
lst_fnames=[fname for fname in lst_fnames if fname.endswith('.zip')]

#take distinct prefixes in the dataframe
df_prefixes=df_filenames['filename_prefix'].unique()

for prefix in df_prefixes:
    #this list will contain zip files with the same prefixes
    lst=[]

    #total count of files in the lst
    count=0
    for fname in lst_fnames:
        if prefix in fname:
            #print(prefix)
            lst.append(fname)
            #print(lst)
    #if the list has more than 1 zip files,merge them
    if len(lst)>1:
        print(lst)
        with zf.ZipFile(lst[0], 'a') as f1:
            print(f1.filename)
            for f in lst[1:]:

                with zf.ZipFile(path+'\\'+f, 'r') as f:
                    print(f.filename) #getting entire path of the file here,not just filename
                    [f1.writestr(t[0], t[1].read()) for t in ((n, f.open(n)) for n in f.namelist())]
                    print(f1.namelist())

将文件名包含filename1的文件内容合并到filename1_160645.zip,后 ``filename1_160645.zip```的内容应该是

1a.csv
1b.csv
1d.csv
1f.csv

但是当我双击 filename1_160645.zip 时没有任何改变 基本上,1a.csv,1b.csv,1d.csv,1f.csv 不属于filename1_160645.zip

【问题讨论】:

    标签: python zipfile


    【解决方案1】:

    我会使用shutil 来获得更高级别的视图来处理存档文件。此外,使用pathlib 为给定的文件路径提供了很好的方法/属性。结合groupby,我们可以很方便的提取出相互关联的目标文件。

    import itertools
    import shutil
    from pathlib import Path
    import pandas as pd
    
    filenames = pd.read_excel('filename_prefix.xlsx')
    prefixes = filenames['filename_prefix'].unique()
    
    path = Path.cwd()  # or change to Path('path/to/desired/dir/')
    zip_files = (file for file in path.iterdir() if file.suffix == '.zip')
    target_files = sorted(file for file in zip_files 
                          if any(file.stem.startswith(pre) for pre in prefixes))
    
    file_groups = itertools.groupby(target_files, key=lambda x: x.stem.split('_')[0])
    for _, group in file_groups:
        first, *rest = group
        if not rest:
            continue
    
        temp_dir = path / first.stem
        temp_dir.mkdir()
    
        shutil.unpack_archive(first, extract_dir=temp_dir)
        for item in rest:
            shutil.unpack_archive(item, extract_dir=temp_dir)
            item.unlink()
    
        shutil.make_archive(temp_dir, 'zip', temp_dir)
        shutil.rmtree(temp_dir)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多