使用文件名作为键创建目录字典

时间:2018-01-21 00:41:37

标签: python python-3.x dictionary tree

我有一个程序,一半工作,这是不够好的。它应该采取一个目录和一个字典,并改变字典,以获得文件名的键(减去扩展名)和pygame图像表面的值,如果它是一个图片,如果该项是一个目录,它的值将是另一个字典,包含该目录的内容。例如,如果我有一个看起来像这样的树:

pics +  
     |  
    pic1.png  
     |  
    pic2.png 
     |
     other_pics 
        +-  
          pic1.png
          |
          pic2.png

您使用pics作为目录,使用空白字典作为字典,您将获得:

{'pic1': <Surface object etc...>
  'pic2': <Surface object etc...>
  'other_pics': {
    'pic1': <Surface object etc...>
    'pic2': <Surface object etc...>
}}

我的代码如下:

from pygame.image import load
import os

def gather_pics(dictionary, dir='.'):

    print(dir)

    for item in os.listdir(dir):
        if os.path.isdir(item):
            dictionary[item] = {}
            gather_pics(dictionary[item], '{}{}{}'.format(dir, '\\' if os.name == 'nt' else '/', item))

        elif item[-4:] in ('.png', '.jpg'):
            dictionary[item.split('.')[0]] = load('{}{}{}'.format(dir, '\\' if os.name == 'nt' else '/', item))

if __name__ == '__main__':
    dict = {}
    gather_pics(dict)
    print(dict)

我不认为它是在子目录的子目录中循环,因为它通常只是为我的所有图片的目录找到一个空的dict。 任何帮助,将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:1)

问题在线

if os.path.isdir(item):

您不添加以前的路径,因此程序会检查,而不是检查other_pics的图片。 for other_pics

另外,创建路径的更好方法是os.path.join

if os.path.isdir(os.path.join(dir, item)):

比设计:

最好不要传递字典并写入它,但要将其归还。另外要检查文件类型,如果你想添加not-3-chars-long类型

,请使用split

我的代码:

from pygame.image import load
import os

def gather_pics(dir='.'):

    dictionary = {}

    print(dir)

    for item in os.listdir(dir):
        if os.path.isdir(os.path.join(dir, item)):
            dictionary[item] = gather_pics(os.path.join(dir, item))

        elif item.split(".")[-1] in ('png', 'jpg'):
            dictionary[item.split('.')[0]] = load(os.path.join(dir, item))

    return dictionary

if __name__ == '__main__':
    dict = gather_pics()
    print(dict)

修改

刚刚注意到你使用“dict”作为变量,小心,它是类型