Python目录搜索和组织由dict

时间:2009-12-10 02:14:46

标签: python path directory subdirectory os.walk

嘿所有,这是我第一次尝试进入Python的文件和操作系统。我试图搜索目录然后找到所有子目录。如果目录没有文件夹,请将所有文件添加到列表中。并用dict整理它们。

因此,例如树可能看起来像这样

  • 起始路径
    • Dir 1
      • Subdir 1
      • Subdir 2
      • Subdir 3
        • subsubdir
          • file.jpg
          • folder1中
            • file1.jpg
            • file2.jpg
          • 文件夹2
            • file3.jpg
            • file4.jpg

即使subsubdir中有一个文件,也应该跳过它,因为它中有文件夹。

现在我可以正常使用os.listdir和os.path.isdir知道我要查找的目录数量。但是,如果我希望它是动态的,它将必须补偿任何数量的文件夹和子文件夹。我尝试过使用os.walk,它可以轻松找到所有文件。我遇到的唯一麻烦是使用包含文件的路径名创建所有dicts。我需要dict组织的foldernames,直到起始路径。

所以最后,使用上面的例子,dict应该看起来像这样的文件:

dict['dir1']['subdir3']['subsubdir']['folder1'] = ['file1.jpg', 'file2.jpg']

dict['dir1']['subdir3']['subsubdir']['folder2'] = ['file3.jpg', 'file4.jpg']

对于有关组织信息的这个或更好的想法的任何帮助表示感谢。感谢。

3 个答案:

答案 0 :(得分:3)

也许你想要这样的东西:

def explore(starting_path):
  alld = {'': {}}

  for dirpath, dirnames, filenames in os.walk(starting_path):
    d = alld
    dirpath = dirpath[len(starting_path):]
    for subd in dirpath.split(os.sep):
      based = d
      d = d[subd]
    if dirnames:
      for dn in dirnames:
        d[dn] = {}
    else:
      based[subd] = filenames
  return alld['']

例如,给定/tmp/a以便:

$ ls -FR /tmp/a
b/  c/  d/

/tmp/a/b:
z/

/tmp/a/b/z:

/tmp/a/c:
za  zu

/tmp/a/d:

print explore('/tmp/a')发出:{'c': ['za', 'zu'], 'b': {'z': []}, 'd': []}

如果这不完全是您所追求的,也许您可​​以具体告诉我们这些差异应该是什么?如果需要的话,我怀疑它们可能很容易修复。

答案 1 :(得分:1)

您希望构建数据的方式存在基本问题。如果dir1/subdir1包含子目录和文件,dict['dir1']['subdir1']应该是列表还是字典?要使用...['subdir2']访问更多子目录,它必须是字典,但另一方面dict['dir1']['subdir1']应返回文件列表。

您必须从以某种方式组合这两个方面的自定义对象构建树,或者您必须更改树结构以区别对待文件。

答案 2 :(得分:1)

我不知道你为什么要这样做。您应该能够使用os.path.walk进行处理,但是如果您真的需要这样的结构,您可以(未经测试):

import os

def dirfunc(fdict, dirname, fnames):
    tmpdict = fdict
    keys = dirname.split(os.sep)[:-1]
    for k in keys:
        tmpdict = tmpdict.setdefault(k, {})

    for f in fnames:
        if os.path.isdir(f):
            return

    tmpdict[dirname] = fnames

mydict = {}
os.walk(directory_to_search, dirfunc, mydict)

此外,您不应将变量命名为dict,因为它是内置的Python。将名称dict重新绑定到Python dict类型以外的其他内容非常糟糕

编辑:已修改以修复“双最后一键”错误并使用os.walk