os.walk ()

Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΠΌΠ΅Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ² Π² Π΄Π΅Ρ€Π΅Π²Π΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ², ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°ΡΡΡŒ ΠΏΠΎ Π΄Π΅Ρ€Π΅Π²Ρƒ свСрху Π²Π½ΠΈΠ· ΠΈΠ»ΠΈ снизу Π²Π²Π΅Ρ€Ρ…. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π² Π΄Π΅Ρ€Π΅Π²Π΅, ΠΈΠΌΠ΅ΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΡ€Π΅Π½ΡŒ Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ сам Π²Π΅Ρ€Ρ…), ΠΎΠ½ Π΄Π°Π΅Ρ‚ ΠΊΠΎΡ€Ρ‚Π΅ΠΆ ΠΈΠ· Ρ‚Ρ€Π΅Ρ… (dirpath, dirnames, filenames).

dirpath - это строка, ΠΏΡƒΡ‚ΡŒ ΠΊ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Ρƒ. dirnames - это список ΠΈΠΌΠ΅Π½ ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² Π² dirpath (ΠΈΡΠΊΠ»ΡŽΡ‡Π°Ρ '.' ΠΈ '..'). filenames - это список ΠΈΠΌΠ΅Π½ Ρ„Π°ΠΉΠ»ΠΎΠ², Π½Π΅ ΡΠ²Π»ΡΡŽΡ‰ΠΈΡ…ΡΡ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°ΠΌΠΈ, Π² dirpath. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π° Π² списках Π½Π΅ содСрТат ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΏΡƒΡ‚ΠΈ. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ начинаСтся с top) ΠΊ Ρ„Π°ΠΉΠ»Ρƒ ΠΈΠ»ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Ρƒ Π² dirpath, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ os.path.join(dirpath, name).

Если Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ topdown ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ True ΠΈΠ»ΠΈ Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½, Ρ‚Ρ€ΠΎΠΉΠΊΠ° для ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° гСнСрируСтся ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Ρ€ΠΎΠΉΠΊΠ°ΠΌΠΈ для любого ΠΈΠ· Π΅Π³ΠΎ ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² (ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ свСрху Π²Π½ΠΈΠ·). Если topdown ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ False, Ρ‚Ρ€ΠΎΠΉΠΊΠ° для ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° создаСтся послС Ρ‚Ρ€ΠΎΠ΅ΠΊ для всСх Π΅Π³ΠΎ ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² (ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ снизу Π²Π²Π΅Ρ€Ρ…). НСзависимо ΠΎΡ‚ значСния topdown, список ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² извлСкаСтся Π΄ΠΎ создания ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ для ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° ΠΈ Π΅Π³ΠΎ ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ².

Когда topdown ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ True, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ список dirnames Π½Π° мСстС (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ del ΠΈΠ»ΠΈ использованиС срСзов списков), Π° walk () Π±ΡƒΠ΄Π΅Ρ‚ рСкурсивно ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ, ΠΈΠΌΠ΅Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ Π² dirnames; это ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для сокращСния поиска, установлСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ порядка посСщСния ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ для информирования walk () ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ создаСт ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΎΠ½ снова Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ walk (). ИзмСнСниС dirnames, ΠΊΠΎΠ³Π΄Π° topdown ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ False, Π½Π΅ влияСт Π½Π° ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ…ΠΎΠ΄Π°, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² восходящСм Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ Π² dirnames ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π΄ΠΎ создания самого dirpath.

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ошибки Π²Ρ‹Π·ΠΎΠ²Π° scandir () ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ. Если ΡƒΠΊΠ°Π·Π°Π½ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ onerror, это Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ функция; ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ с ΠΎΠ΄Π½ΠΈΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ - экзСмпляром OSError. Она ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ ΠΎΠ± ошибкС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ ΠΎΠ±Ρ…ΠΎΠ΄, ΠΈΠ»ΠΈ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Ρ€Π²Π°Ρ‚ΡŒ ΠΎΠ±Ρ…ΠΎΠ΄. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ имя Ρ„Π°ΠΉΠ»Π° доступно ΠΊΠ°ΠΊ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ filename ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ.

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ walk () Π½Π΅ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎ символичСским ссылкам, Π²Π΅Π΄ΡƒΡ‰ΠΈΠΌ ΠΊ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°ΠΌ. УстановитС для followlinks Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ True, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΠ΅Ρ‰Π°Ρ‚ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ символичСскиС ссылки, Π² систСмах, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡ… ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚.

Π˜ΠΌΠ΅ΠΉΡ‚Π΅ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ установка для followlinks Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ True ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ бСсконСчной рСкурсии, Ссли ссылка ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° свой Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³. walk() Π½Π΅ отслСТиваСт ΡƒΠΆΠ΅ посСщСнныС ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ.

Если Π²Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚Π΅ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ, Π½Π΅ мСняйтС Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΠΌΠ΅ΠΆΠ΄Ρƒ продолТСниями Ρ€Π°Π±ΠΎΡ‚Ρ‹ walk (). walk () Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ измСняСт Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΠΈ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π°Ρ сторона Ρ‚ΠΎΠΆΠ΅ Π½Π΅ мСняСт.

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ отобраТаСтся количСство Π±Π°ΠΉΡ‚ΠΎΠ², занятых Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ, Π½Π΅ ΡΠ²Π»ΡΡŽΡ‰ΠΈΠΌΠΈΡΡ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°ΠΌΠΈ, Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ Π² Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π½Π΅ просматриваСт Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ CVS:

import os
from os.path import join, getsize
for root, dirs, files in os.walk('python/Lib/email'):
    print(root, "consumes", end=" ")
    print(sum(getsize(join(root, name)) for name in files), end=" ")
    print("bytes in", len(files), "non-directory files")
    if 'CVS' in dirs:
        dirs.remove('CVS')  # Π½Π΅ ΡΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ CVS

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ (простая рСализация shutil.rmtree ()) Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π΄Π΅Ρ€Π΅Π²ΠΎ снизу Π²Π²Π΅Ρ€Ρ…, rmdir () Π½Π΅ позволяСт ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, ΠΏΠΎΠΊΠ° ΠΎΠ½ Π½Π΅ станСт пустым:

# Π£Π΄Π°Π»ΠΈΡ‚Π΅ всС доступноС ΠΈΠ· ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π² "top",
# ΠΏΡ€ΠΈ условии, Ρ‡Ρ‚ΠΎ Π½Π΅Ρ‚ символичСских ссылок.
# Π’ΠΠ˜ΠœΠΠΠ˜Π•:  Π­Ρ‚ΠΎ опасно!  НапримСр, Ссли top == '/',
# ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ всС Ρ„Π°ΠΉΠ»Ρ‹ Π½Π° вашСм дискС.
import os
for root, dirs, files in os.walk(top, topdown=False):
    for name in files:
        os.remove(os.path.join(root, name))
    for name in dirs:
        os.rmdir(os.path.join(root, name))

ИзмСнСно Π² вСрсии 3.5: эта функция Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ os.scandir () вмСсто os.listdir (), Ρ‡Ρ‚ΠΎ ускоряСт Ρ€Π°Π±ΠΎΡ‚Ρƒ Π·Π° счСт ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ количСства Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² os.stat ().

ИзмСнСно Π² вСрсии 3.6: ΠŸΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΠΈ (path-like object ).

Last updated