• 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

Ultraszybki serwer VPS NVMe START
0 głosów
73 wizyt
pytanie zadane 6 stycznia 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 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 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 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 185 wizyt
+1 głos
1 odpowiedź 80 wizyt
pytanie zadane 9 sierpnia w Python, Django przez DODO Obywatel (1,970 p.)
0 głosów
1 odpowiedź 119 wizyt
pytanie zadane 11 kwietnia w C i C++ przez hacker09 Początkujący (370 p.)

41,475 zapytań

80,496 odpowiedzi

159,288 komentarzy

19,796 pasjonatów

Przeglądających: 306
Pasjonatów: 18 Gości: 288

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.

...