Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将多个zip文件中的文件添加到单个zip文件中_Python_Zipfile - Fatal编程技术网

Python 如何将多个zip文件中的文件添加到单个zip文件中

Python 如何将多个zip文件中的文件添加到单个zip文件中,python,zipfile,Python,Zipfile,我想把多个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 我有以下包含filename前缀的dataf

我想把多个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
我有以下包含filename前缀的dataframe df_文件名

filename_prefix

filename1
filename2
filename3
如果temp文件夹中有多个.zip文件,其前缀与dataframe df_文件名中存在的前缀相同,我希望合并这些文件的内容

例如
filename1\u 160645.zip包含以下内容

1a.csv
1b.csv
1d.csv
1f.csv
filename1\u 165056.zip
包含以下内容

1a.csv
1b.csv
1d.csv
1f.csv
filename195326.zip包含以下内容

1a.csv
1b.csv
1d.csv
1f.csv
将上述两个文件的内容合并到
filename1\u 160645.zip中后
filename1\u 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\u 160645.zip中后,
“`filename1\u 160645.zip``的内容应为

1a.csv
1b.csv
1d.csv
1f.csv
但当我双击
filename1\u 160645.zip时,没有任何变化

基本上,1a.csv、1b.csv、1d.csv、1f.csv不是
filename1\u 160645.zip的一部分
我将使用
shutil
来获得处理归档文件的更高级别视图。另外,使用
pathlib
为给定的文件路径提供了很好的方法/属性。与
groupby
相结合,我们可以轻松提取彼此相关的目标文件

导入itertools
进口舒蒂尔
从pathlib导入路径
作为pd进口熊猫
filenames=pd.read\u excel('filename\u prefix.xlsx')
前缀=文件名['filename\u prefix'].unique()
path=path.cwd()#或更改为path('path/to/desired/dir/'))
zip_files=(如果file.suffix='.zip',则路径.iterdir()中的文件对应文件)
target_files=已排序(zip_文件中的文件对应文件)
如果有(file.stem.startswith(pre)表示前缀中的pre))
file_groups=itertools.groupby(target_files,key=lambda x:x.stem.split(“”“)[0])
对于u,文件组中的组u组:
首先,*rest=group
如果没有休息:
持续
temp_dir=路径/第一个阀杆
临时目录mkdir()
解包存档(首先,提取目录=临时目录)
对于静止项目:
解包存档(项目,提取目录=临时目录)
项目.取消链接()
shutil.make_存档(临时目录,'zip',临时目录)
shutil.rmtree(临时目录)