2011-12-18 3 views
1

Я хотел бы избежать os.walk, я использую рекурсивную функцию для чтения файлов и папок и хранить файлы в словарьпитона рекурсивного каталог чтение

Я избавился от os.chdir, но для некоторой функции разума является теперь также присоединяется к файлу + пути и генерирует ошибку: WindowsError: [Ошибка 267] Недопустимое имя каталога: 'c: \ data \ foo \ notes \ *. *' Его папка для чтения foo и она соединяла путь whit Foo и файл notes.txt вместо внесения обув + libary папку

+0

http://stackoverflow.com/questions/2212643/python-recursive-folder-read выглядеть как-то для вас – matiit

+6

Почему вы не хотите os.walk ?. Это специально для этой цели. Я ошибаюсь? – joaquin

+0

Хорошо, если вы все еще учитесь os.walk ничего не дает, если вы хотите понять, как все работает. Например, в C и Java у меня не было такой вещи, как os.walk, поэтому я должен был реализовать ее с помощью рекурсивных функций. –

ответ

2

Это похоже на работу для меня

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']})

+0

Вместо явного цикла попробуйте: 'data.update (fileRead (путь) .items()) ' – hughdbrown

+0

@hughdbrown отлично! Я его отредактировал – joaquin

+0

@hughdbrown, я откатился в явный цикл с расширением списка, потому что в противном случае повторяющиеся файлы в дереве каталогов не отображают список разных каталогов. Проверьте мое редактирование в сообщении. – joaquin