【问题标题】:Preserving all the subdirectories when saving a file - Python保存文件时保留所有子目录 - Python
【发布时间】:2022-01-05 20:18:50
【问题描述】:

我有一个包含各种子目录的文件夹,其中包含具有不同扩展名的文件,例如 .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 等)。对此的任何帮助将不胜感激!

【问题讨论】:

  • 您在哪里/如何识别主输出文件夹?
  • 我将它的路径作为参数发送到 Pycharm 中
  • 您如何在代码中使用它来创建新文件?

标签: python recursion glob subdirectory


【解决方案1】:

需要意识到的是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 版本的 Python 3.10 中,这可能更简单:

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)

【讨论】:

  • 我不知道 Path.relative_to 函数。这真的很有帮助,非常感谢!
【解决方案2】:

基本上,这是 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,所以没有测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    • 2017-10-09
    • 1970-01-01
    • 2020-04-21
    • 2018-09-13
    相关资源
    最近更新 更多