嘿所有,这是我第一次尝试进入Python的文件和操作系统。我试图搜索目录然后找到所有子目录。如果目录没有文件夹,请将所有文件添加到列表中。并用dict整理它们。
因此,例如树可能看起来像这样
即使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']
对于有关组织信息的这个或更好的想法的任何帮助表示感谢。感谢。
答案 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
。