使用zip文件中的根目录名重命名子目录中的文件



我的zip文件中有以下目录结构:

myzip.zip
- directory 1
- subdirectory 1
- imageA.jpg
- imageB.jpg
- directory 2 
- subdirectory 2
- imageA.jpg
- imageB.jpg

我的目标是将.jpg文件重命名为主目录名,如下所示:

myzip.zip
- directory 1
- subdirectory 1
- directory 1-1.jpg
- directory 1-2.jpg
- directory 2 
- subdirectory 2
- directory 2-1.jpg
- directory 2-2.jpg

因此,考虑到一个子目录可以包含多个.jpg文件,在每个新重命名的.jpg文件之后从1开始增加一个增量(因此新文件名目录为1-1/jpg(

最后,我想将这些更改写入一个新的zip文件,保持相同的结构,唯一的区别是更改后的名称与.jpg文件不同。

我的代码想法:

import zipfile
source = zipfile.ZipFile("myzip.zip", 'r')
target = zipfile.ZipFile(source.filename+"_renamed"+".zip", 'w', zipfile.ZIP_DEFLATED)
for file in source.infolist():
filename = file.filename #directory 1/subdirectory 1/imageA.jpg
rootname, image_name = filename.split("/subdirectory")
# rootname results in: directory 1 
# image_name results in /subdirectory/image_name.jpg
new_image = image_name.replace(image_name, "/subdirectory/"+rootname+image_name[4:])
target.write(rootname+new_image)

我想(还没有真正测试过(使用zipfile。Zipfile和一些使用上面代码的东西,但老实说,我真的不知道如何解决这个问题。

有什么想法或例子吗?

下面是一些伪代码,表示如何实现它:

unzip myzip.zip
for directory in unzipped:
for subdirectory in directory:
i = 0
for file in subdirectory:
file.rename(f"{directory.name}-{i}.jpg")
i += 1
zip unzipped

基于@bobtho'-'伪代码,我创建了以下程序:

import os
import zipfile
import sys
import shutil
root = os.path.join(sys.path[0])
unzipped = os.path.join(root,"unzipped") #a folder to extract/unzip your content to
if not os.path.exists(unzipped):
print("Create new unzipped directory")
os.makedirs(unzipped)
elif len(os.listdir(unzipped)) != 0:
shutil.rmtree(unzipped) # remove the old folder and its contents
os.makedirs(unzipped)
filename = "myfile.zip"
source = os.path.join(root, filename)
with zipfile.ZipFile(source) as source:
source.extractall(unzipped)
target = zipfile.ZipFile(source.filename, 'w')
with target:
for filename in os.listdir(unzipped):
directory = os.path.join(unzipped, filename)
for sub_dir in os.listdir(directory): 
files = os.path.join(unzipped, directory, sub_dir)
i = 0
for file in os.listdir(files):
old_file_path = os.path.join(unzipped, directory, sub_dir, file)
print(filename)
renamed_file = "{directory}-{i}.jpg".format(directory=filename, i=i)
new_file_path = os.path.join(unzipped, directory, sub_dir, renamed_file)
os.rename(old_file_path, new_file_path)
directory_to_zip = os.path.relpath(os.path.join(filename, sub_dir, renamed_file))
target.write(new_file_path, directory_to_zip)
i += 1
target.close()
shutil.rmtree(unzipped)

我认为这不是最好(或最快(的解决方案,但符合我的目标。希望有人能从中得到帮助。

最新更新