我试图浏览一个包含超过650个目录的目录,其中每个目录有3个子目录,然后包含.png
个文件。所以我有类似的东西:
MAIN
└───folder_01
| └─subfolder_01
| | └─12.png
| └─subfolder_02
| | └─... .png
| └─subfolder_03
| └─cm_12.png
│
└───folder_02
| └─subfolder_01
| | └─34.png
| └─subfolder_02
| | └─... .png
| └─subfolder_03
| └─cm_34.png
│
...
我尝试做的是从.png
和subfolder_01
中的subfolder_03
中提取路径。这两个文件夹都包含一个.png
图片,subfolder_03
中的文件与subfolder_01
中的文件同名,并添加了前缀cm_
。
我想将路径存储在字典中,其中键是图像名称(没有扩展名),值是元组,其中第一个条目是subfolder_01
中找到的图像的路径第二个条目是subfolder_03
中找到的图像的路径,所以我有类似的东西:
my_dict = {image 12 name: (path to 12.png, path to cm_12.png,
image 34 name: (path to 34.png, path to cm_34.png),
...}
更复杂的是图像文件是64长度哈希。我下面有一些代码,但我遇到了一个问题,因为它似乎转到subfolder_03
并在转到subfolder_01
之前选择了该图像。我试图改变解决问题的if
声明的顺序,但我希望找到一个更通用的解决方案,这并不是真正依赖于if
语句的顺序。
为了完整性,代码:
def get_data(loc: str) -> Dict[str, Directories]:
"""
Looks through the given directory and returns a dictionary where the
key is the file name and the values are the locations of the training
image and the mask
"""
im_paths = []
im_imMask = {}
for root, dirs, files in os.walk(loc):
# mask_paths = []
im_combined = ""
for file in files:
if file.endswith(".png"):
im_path = root + "/{}".format(file)
im_paths.append(im_path)
# print(root)
if os.path.basename(root) == "images":
key = os.path.splitext(file)[0]
im_loc = root + "/{}".format(file)
elif os.path.basename(root) == "combined":
im_combined = root + "/{}".format(file)
# mask_paths.append(root + "/{}".format(file))
im_imMask[key] = (im_loc, im_combined)
return im_imMask
答案 0 :(得分:1)
我认为你要做的就是在你完成时输入这样的条目:
image 12 name: (path to 12.png, path to cm_12.png)
...无论您访问哪两个文件的订单。
如果您愿意拥有两个文件的列表而不是元组,这将更容易。然后你可以做类似的事情:
key = os.path.splitext(file)[0]
if filename.startswith('cm_'):
key = key[3:]
d.setdefault(key, [None, None])[1] = path
else:
d.setdefault(key, [None, None])[0] = path
setdefault
将确保您之前找到的文件在替换第一个或第二个元素之前创建[None, None]
,但稍后找到的文件将对已创建的对执行。< / p>
听起来你想要结束setdefault
所以你不必重复自己。你可以将它重构成一个函数:
def storename(key, idx):
d.setdefault(key, [None, None])[idx] = path
if filename.startswith('cm_'):
storename(key[3:], 1)
else:
storename(key, 0)
或者您可以将值存储在变量中:
cm = filename.startswith('cm_')
if cm:
key = [3:]
d.setdefault(key, [None, None])[cm] = path
(这取决于True
和False
与1
和0
相同的事实。如果这对您来说似乎很神秘,请将其更改为{{1 }}。)
或者你可以将两者结合起来。