保存文件时保留所有子目录 - Python

Preserving all the subdirectories when saving a file - Python

我有一个包含各种子目录的文件夹,其中包含具有不同扩展名的文件,例如 .jpg、.png 等。我只想提取 .jpg 文件并对它们执行一些操作,例如裁剪、等然后我想将这些 new 文件(即裁剪后的文件)保存到它们来自的子目录中。但是,我不希望将这些新文件保存到它们来自的同一文件夹中。相反,我希望将它们保存到一个不同的文件夹中,该文件夹包含它们来自的所有具有相同名称的相同子目录。这个新文件夹必须只包含 new 裁剪后的文件。我在下面附上了一个插图,以更好地解释我的问题。

我试过以下方法:

for imgs in glob.iglob(self.Main_Folder + '//**/*.jpg', recursive=True):
    Output_Folder = os.path.join(os.path.dirname(imgs), "cropped" + str(idx) + ".jpg")

但是,这会覆盖主文件夹中子目录中的 .jpg 文件(即覆盖 1.jpg、2.jpg 等)。如有任何帮助,我们将不胜感激!

需要注意的一件事是 glob.iglob 生成的路径包括整个匹配模式,其中包括您的 self.Main_Folder。因此,您必须首先确定相对于主文件夹的子路径,并将其与输出文件夹连接起来。例如。 "main_folder/found/path.jpg" -> "found/path.jpg" -> "output_folder/found/path.jpg"pathlib 库提供了一种使用 Path.relative_to.

的简单方法
import glob
import os
import pathlib

main_folder = "somewhere/Main Folder"
output_folder = "somewhere/Output Folder"
for name in glob.iglob(os.path.join(main_folder, "**/*")):
    path = pathlib.Path(name)
    sub_path = path.relative_to(main_folder)
    output_path = os.path.join(output_folder, sub_path)
    print(output_path)

你可以通过使用更多的 pathlib API(尤其是使用 / 加入路径的能力)来变得更漂亮,但这是否更清楚可能值得商榷:

main_folder = "somewhere/Main Folder"
output_folder = "somewhere/Output Folder"
for name in glob.iglob(str(main_folder / "**/*")):
    path = pathlib.Path(name)
    output_path = output_folder / path.relative_to(main_folder)
    print(output_path)

在 Python 3.10 中,这是撰写本文时最新的 Python 版本,这可以更简单:

main_folder = pathlib.Path("scratch")
output_folder = pathlib.Path("output")
for name in glob.iglob("**/*", root_dir=main_folder):
    output_path = output_folder / name
    print(output_path)

基本上,这是 3 个问题

  • iglob 用于查找 jpg 文件
  • 用于图像处理的枕头
  • 创建新 jpg 文件路径的机制

第一个你已经掌握了,第二个是微不足道的,第三个是这样的:

from pathlib import Path
apath = Path(“a/b/c/a.jpg”)  # to your jpg
root = “a/b”
new_dir = Path(“some/path”)
new_path = new_dir.joinpath(apath.relative_to(root))
# should be some/path/c/a.jpg

这里没有python,所以没有测试。