保存文件时保留所有子目录 - 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,所以没有测试。
我有一个包含各种子目录的文件夹,其中包含具有不同扩展名的文件,例如 .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,所以没有测试。