• 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
77 wizyt
pytanie zadane 6 stycznia 2017 w Python, Django przez krzysiuup Obywatel (1,160 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 2017 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 2017 przez krzysiuup Obywatel (1,160 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 2017 przez Krzysztof Pawliczuk Obywatel (1,500 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 264 wizyt
+1 głos
1 odpowiedź 81 wizyt
pytanie zadane 9 sierpnia 2017 w Python, Django przez DODO Bywalec (2,350 p.)
0 głosów
1 odpowiedź 92 wizyt
pytanie zadane 23 grudnia 2017 w Algorytmy przez Sensej Początkujący (400 p.)
Porady nie od parady
Wynikowy wygląd pytania, odpowiedzi czy komentarza, różni się od tego zaprezentowanego w edytorze postów. Stosuj więc funkcję Podgląd posta znajdującą się pod edytorem, aby upewnić się, czy na pewno ostateczny rezultat ci odpowiada.
Ciekawy innych porad? Odwiedź tę stronę!

45,720 zapytań

86,115 odpowiedzi

171,964 komentarzy

22,180 pasjonatów

Przeglądających: 321
Pasjonatów: 20 Gości: 301

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...