[英]How to parse a directory tree in python?
I have a directory called "notes" within the notes I have categories which are named "science", "maths" ... within those folder are sub-categories, such as "Quantum Mechanics", "Linear Algebra".我在笔记中有一个名为“notes”的目录,我有一个名为“science”、“maths”的类别……在这些文件夹中是子类别,例如“Quantum Mechanics”、“Linear Algebra”。
./notes
--> ./notes/maths
------> ./notes/maths/linear_algebra
--> ./notes/physics/
------> ./notes/physics/quantum_mechanics
My problem is that I don't know how to put the categories and subcategories into TWO SEPARATE list/array.我的问题是我不知道如何将类别和子类别放入两个单独的列表/数组中。
You could utilize os.walk
.你可以利用
os.walk
。
#!/usr/bin/env python
import os
for root, dirs, files in os.walk('notes'):
print(root, dirs, files)
Naive two level traversing:朴素的两级遍历:
import os
from os.path import isdir, join
def cats_and_subs(root='notes'):
"""
Collect categories and subcategories.
"""
categories = filter(lambda d: isdir(join(root, d)), os.listdir(root))
sub_categories = []
for c in categories:
sub_categories += filter(lambda d: isdir(join(root, c, d)),
os.listdir(join(root, c)))
# categories and sub_categories are arrays,
# categories would hold stuff like 'science', 'maths'
# sub_categories would contain 'Quantum Mechanics', 'Linear Algebra', ...
return (categories, sub_categories)
if __name__ == '__main__':
print(cats_and_subs(root='/path/to/your/notes'))
os.walk is pretty much ideal for this. os.walk 非常适合于此。 By default it will do a top-down walk, and you can terminate it easily at the 2nd level by settings 'dirnames' to be empty at that point.
默认情况下,它将执行自上而下的遍历,您可以通过将 'dirnames' 设置为空来轻松地在第二级终止它。
import os
pth = "/path/to/notes"
def getCats(pth):
cats = []
subcats = []
for (dirpath, dirnames, filenames) in os.walk(pth):
#print dirpath+"\n\t", "\n\t".join(dirnames), "\n%d files"%(len(filenames))
if dirpath == pth:
cats = dirnames
else:
subcats.extend(dirnames)
dirnames[:]=[] # don't walk any further downwards
# subcats = list(set(subcats)) # uncomment this if you want 'subcats' to be unique
return (cats, subcats)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.