os.walk() și os.fwalk() în Python

Fișiere și directoare (os) Python 3.0+ (fwalk: 3.3+, Unix)

Parcurge recursiv un arbore de directoare, dând pentru fiecare director subdirectoarele și fișierele lui.

Sintaxă
for director, subdirectoare, fisiere in os.walk(radacina, topdown=True):
    ...

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[:] = [...]); walk continuă să intre în toate directoarele.

Comenzi înrudite