Ce face os.walk() și os.fwalk()
walk(radacina) produce, pentru fiecare director din arbore, tuplul (cale_director, nume_subdirectoare, nume_fisiere). Cu topdown=True (implicit) poți modifica pe loc lista subdirectoare ca să sari peste unele directoare (de exemplu .git).
fwalk() (Unix) produce în plus un descriptor deschis pentru fiecare director, protejând împotriva unor probleme de securitate cu legături simbolice. Path.walk() (3.12+) este echivalentul din pathlib.
Parametri
| Parametru | Descriere |
|---|---|
radacina / top |
Directorul de pornire. |
topdown |
Ordinea parcurgerii. |
onerror |
Funcție apelată la erori. |
followlinks |
Intră și în legăturile simbolice spre directoare. |
Ce returnează
Un generator de tupluri.
Exemple
Exemplul 1: Mărimea totală, sărind peste .git
import os
for cale, continut in [("proiect/main.py", 120), ("proiect/lib/util.py", 80), ("proiect/.git/obiect", 5000)]:
os.makedirs(os.path.dirname(cale), exist_ok=True)
with open(cale, "w") as f:
f.write("x" * continut)
total = 0
for director, subdirectoare, fisiere in os.walk("proiect"):
subdirectoare[:] = [d for d in subdirectoare if not d.startswith(".")]
for nume in fisiere:
total += os.path.getsize(os.path.join(director, nume))
print(director, sorted(fisiere))
print("Total:", total, "octeți")
Rezultat
proiect ['main.py']
proiect/lib ['util.py']
Total: 200 octeți
Exemplul 2: fwalk
import os
os.makedirs("a/b", exist_ok=True)
open("a/b/f.txt", "w").close()
for director, subdirectoare, fisiere, fd in os.fwalk("a"):
print(director, subdirectoare, fisiere, os.listdir(fd) == subdirectoare + fisiere)
Rezultat
a ['b'] [] True
a/b [] ['f.txt'] True
Greșeli frecvente
- Atribui o listă nouă (
subdirectoare = [...]) în loc să modifici lista pe loc (subdirectoare[:] = [...]);walkcontinuă să intre în toate directoarele.
Comenzi înrudite
Path.iterdir(), glob(), rglob() și walk(): Parcurge conținutul unui director, cu sau fără subdirectoare, eventual filtrat după un model.os.scandir() și os.DirEntry: Parcurge un director rapid, cu tipul și informațiile fiecărui element.os.listdir(): Returnează lista numelor fișierelor și directoarelor dintr-un director.