gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 06:57:17 25 4
gpt4 key购买 nike

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

我有一个文件夹“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

将以上两个文件的内容合并到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

的一部分

最佳答案

我会使用shutil作为更高级别的 View 来处理存档文件。另外,使用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)

关于python - 如何将多个 zip 文件中的文件添加到单个 zip 文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58757645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com