0

大家好,这是我最近第一次尝试进入 Python 的文件和操作系统部分。我正在尝试搜索一个目录,然后找到所有子目录。如果目录没有文件夹,请将所有文件添加到列表中。并按 dict 组织它们。

例如,一棵树可能看起来像这样

  • 起始路径
    • 目录 1
      • 子目录 1
      • 子目录 2
      • 子目录 3
        • 子目录
          • 文件.jpg
          • 文件夹1
            • 文件1.jpg
            • 文件2.jpg
          • 文件夹2
            • 文件3.jpg
            • 文件4.jpg

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

现在,如果我知道要查找多少个目录,我通常可以使用 os.listdir 和 os.path.isdir 执行此操作。但是,如果我希望它是动态的,它将必须补偿任何数量的文件夹和子文件夹。我曾尝试使用 os.walk,它会轻松找到所有文件。我遇到的唯一麻烦是使用包含文件的路径名创建所有字典。我需要由 dict 组织的文件夹名称,直到起始路径。

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

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

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

将不胜感激任何帮助或组织信息的更好的想法。谢谢。

4

3 回答 3

4

也许你想要类似的东西:

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': []}

如果这不是您所追求的,也许您可​​以具体向我们展示应该有哪些差异?如果需要,我怀疑它们可能很容易修复。

于 2009-12-10T06:27:11.303 回答
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 内置的。将名称重新绑定到 Python类型以外的名称是一个非常糟糕的主意。dictdict

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

于 2009-12-10T03:31:49.707 回答
1

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

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

于 2009-12-10T02:41:40.497 回答