遍历目录并在特定订单时附加到字典

时间:2018-03-29 00:42:03

标签: python

我试图浏览一个包含超过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   
│
...

我尝试做的是从.pngsubfolder_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 

1 个答案:

答案 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

(这取决于TrueFalse10相同的事实。如果这对您来说似乎很神秘,请将其更改为{{1 }}。)

或者你可以将两者结合起来。