обход дерева и возвращание типов

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# 0 - директория
# 1 - файл
# 2 - символическая ссылка на директорию
# 3 - символическая ссылка на файл
def pathType(path):
'Возвращает тип пути'
is_link = os.path.islink(path)
is_dir = os.path.isdir(path)
is_file = os.path.isfile(path)
if is_dir and not is_link: return 0
elif is_dir and is_link: return 2
elif is_file and not is_link: return 1
elif is_file and is_link: return 3
return -1
class listdir:
'Рекурсивный листинг директорий'
def __init__(self, directory):
self.directory = directory
self.errors = []
def _listdir(self,directory):
'Просто листинг директории по моим правилам'
ret = []
try:
for x in os.listdir(directory):
pt = pathType(directory+'/'+x)
if pt in (0,1): ret.append((pt,x))
except OSError,argv: self.errors.append(argv)
return ret
# Возвращает (dirpath,[(type,dir_or_file)])
def walk(self,directory=None):
'Своя функция обхода дерева'
if directory==None: directory = self.directory
type = pathType(directory)
ld = self._listdir(directory)
yield (directory,ld)
for type,name in ld:
if type == 0 :
r = self.walk(directory+'/'+name)
for y in r:
yield y
dirs = share.utils.listdir(directory)
for dirpath,files_or_dirs in dirs.walk():
print dirpath,files_or_dirs