• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Rekurencyjne czytanie zawartości folderu zwraca nieoczekiwany wynik

0 głosów
66 wizyt
pytanie zadane 6 stycznia w Python, Django przez krzysiuup Użytkownik (820 p.)

Cześć.

Chciałbym przeczytać całą zawartość pewnego folderu, wraz z jego podkatalogami i plikami, oraz plikami w podkatalogach i tak dalej... Zrobiłem klasę Directory wraz z metodą getEntries() która rekurencyjnie wczytuje kolejne encje i wrzuca je odpowiednio do słownika entries['directories'] i entries[files]. Zresztą, spójrzcie sami:

class Directory:
    entries = {
        'directories' : {},
        'files' : []
    }

    def __init__(self, pathToSet):
        self.path = pathToSet

    def getEntries(self):
        contents = [entry for entry in self.path.iterdir()]
        for entry in contents:
            if entry.is_dir():
                subdir = Directory(entry)
                self.entries['directories'].update({entry.name : subdir.getEntries()})
            else:
                self.entries['files'].append(entry.name)
        return self.entries

Wywołuje tę metodę podając ścieżkę do interesującego mnie folderu, ale rezultat mnie nie zadowala.

Załóżmy, że czytany folder ma strukturę tak jak poniżej:

Foldery:
pojazdy : samochod.txt, rower.txt
owoce : ananas.txt, jablko.txt
zwierzeta : kura.txt, slon.txt
Pliki:
plik1.txt, plik2.txt
 

Spodziewam sie nastepujacego wyniku

[
'directories' : { pojazdy : [ samochod.txt, rower.txt ], owoce : [ ananas.txt, jablko.txt ], zwierzeta : [ kura.txt, slon.txt] },
'files' : [ plik1.txt, plik2.txt ]
]

Lecz otrzymuję to:

[
'directories' : { pojazdy : [ ... ], owoce : [ ... ], zwierzeta : [ ... ] },
'files' : [ plik1.txt, plik2.txt, samochod.txt, rower.txt, ananas.txt, jablko.txt, kura.txt, slon.txt ]
]

Z góry dziękuję za pomoc,

Pozdrawiam

 

2 odpowiedzi

0 głosów
odpowiedź 7 stycznia przez Franklin Obywatel (1,140 p.)
Możesz skorzystać z 'walk' z modulu 'os'.

https://www.tutorialspoint.com/python/os_walk.htm
1
komentarz 7 stycznia przez krzysiuup Użytkownik (820 p.)
Fakt, widziałem tę funkcję wcześniej, ale jakoś ją zignorowałem i wynalazłem koło na nowo :/

Dzięki :)
0 głosów
odpowiedź 12 stycznia przez Krzysztof Pawliczuk Obywatel (1,300 p.)

poza os.walk...

import os
for root, dirs, files in os.walk('../target_dir', topdown=False):
    for file in files:
        print('test1', root, file)
    for dir in dirs:
        print('tes11', root, dir)

sprawdź co robi moduł shutil.

moduł shutil jest zbudowany w oparciu o os i zapewnia jednolinijkowca dla w/w przykładu, usuwanie rekurencyjne z użyciem shutil to np:

shutil.rmtree('src')

Podobne pytania

0 głosów
4 odpowiedzi 115 wizyt
0 głosów
1 odpowiedź 32 wizyt
0 głosów
1 odpowiedź 228 wizyt
pytanie zadane 12 listopada 2015 w C i C++ przez Plessio Użytkownik (970 p.)
...