Python 如何将多个zip文件中的文件添加到单个zip文件中
我想把多个zip文件中具有公共子字符串的文件放在一个zipfile中 我有一个文件夹“temp”,其中包含一些.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
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(临时目录)