Это похоже на работу для меня
import os
op = os.path
def fileRead(mydir):
data = {}
root = set()
for i in os.listdir(mydir):
path = op.join(mydir, i)
print(path)
if op.isfile(path):
data.setdefault(i, set())
root.add(op.relpath(mydir).replace("\\", "/"))
data[i] = root
else:
data.update(fileRead(path))
return data
d = fileRead("c:\python32\programas")
print(d)
Тем не менее я не уверен, почему вы используете установленный корень. Я считаю, что цель состоит в том, чтобы сохранить все каталоги, когда у вас есть тот же файл в двух каталогах. Но это не работает: каждое обновление удаляет сохраненные значения для повторяющихся ключей (имена файлов).
Здесь вы рабочий код, используя defaultdict/вы можете сделать то же самое с обычным словарем (как в вашем коде), но с использованием defauldict вам не нужно, чтобы проверить, если ключ был инициализирован перед:
import os
from collections import defaultdict
op = os.path
def fileRead(mydir):
data = defaultdict(list)
for i in os.listdir(mydir):
path = op.join(mydir, i)
print(path)
if op.isfile(path):
root = op.relpath(mydir).replace("\\", "/")
data[i].append(root)
else:
for k, v in fileRead(path).items():
data[k].extend(v)
return data
d = fileRead("c:\python32\programas")
print(d)
Edit: Относительно комментарий от @hughdbrown:
при обновлении данных с data.update(fileRead(path).items())
вы получаете Tthis при вызове fileRead("c:/python26/programas/pack")
в моем компьютере (сейчас в ру 26):
c:/python26/programas/pack\copia.py
c:/python26/programas/pack\in pack.py
c:/python26/programas/pack\pack2
c:/python26/programas/pack\pack2\copia.py
c:/python26/programas/pack\pack2\in_pack2.py
c:/python26/programas/pack\pack2\pack3
c:/python26/programas/pack\pack2\pack3\copia.py
c:/python26/programas/pack\pack2\pack3\in3.py
defaultdict('list'>, {'in3.py': ['pack/pack2/pack3'], 'copia.py': ['pack/pack2/pack3'],
'in pack.py': ['pack'], 'in_pack2.py': ['pack/pack2']})
Обратите внимание, что файлы, которые повторяются в нескольких каталогах (copia.py) показывают только один из этих каталогов, тем глубже один. Однако все каталоги перечислены при использовании:
for k, v in fileRead(path).items(): data[k].extend(v)
c:/python26/programas/pack\copia.py
c:/python26/programas/pack\in pack.py
c:/python26/programas/pack\pack2
c:/python26/programas/pack\pack2\copia.py
c:/python26/programas/pack\pack2\in_pack2.py
c:/python26/programas/pack\pack2\pack3
c:/python26/programas/pack\pack2\pack3\copia.py
c:/python26/programas/pack\pack2\pack3\in3.py
defaultdict(, {'in3.py': ['pack/pack2/pack3'], 'copia.py': ['pack', 'pack/pack2', 'pack/pack2/pack3'],
'in pack.py': ['pack'], 'in_pack2.py': ['pack/pack2']})
http://stackoverflow.com/questions/2212643/python-recursive-folder-read выглядеть как-то для вас – matiit
Почему вы не хотите os.walk ?. Это специально для этой цели. Я ошибаюсь? – joaquin
Хорошо, если вы все еще учитесь os.walk ничего не дает, если вы хотите понять, как все работает. Например, в C и Java у меня не было такой вещи, как os.walk, поэтому я должен был реализовать ее с помощью рекурсивных функций. –