Blog JSystems - uwalniamy wiedzę!

Szukaj

Funkcja os.walk

os.walk to funkcja pozwalająca na przeszukiwanie katalogów. Jako argument przyjmuje ścieżkę startową (w minimalnej wersji konfiguracji), a następnie umożliwia nam iterację po wynikach. Ilustruje to poniższy przykład:

import os
for p in os.walk('D:\\skany'):
    print(p)

Wynika działania:

Iterując po wyniku otrzymujemy krotki. Pierwsza wartość (str) w elemencie to ścieżka katalogu którego dotyczą dalsze dane w krotce. Druga wartość w krotce to katalogi zawarte w danym folderze, trzecia to pliki. Walk pracuje rekurencyjnie, wejdziemy więc w głąb wszystkich katalogów. Możemy też zmienić kierunek przeszukiwania katalogów:

import os
for p in os.walk('D:\\skany',False):
    print(p)

Ustawienie w drugim argumencie funkcji walk wartości fałsz zmienia kierunek przeszukiwania:

Ponieważ otrzymujemy krotki, możemy też odebrać dane do osobnych list. Przy okazji podrzucam patent na wizualizację drzewa:

import os
for katalog,podkatalogi, pliki in os.walk("d:\\skany"):
    print(f'KATALOG: {katalog}:')
    if(len(podkatalogi)>0):
        print(f'    PODKATALOGI: ')
        for po in podkatalogi:
            print(f'         {po}')
    if(len(pliki)>0):
        print(f'    PLIKI: ')
        for pl in pliki:
            print(f'         {pl}')

Wynik działania:

Poruszanie się po systemie plików

Zmiana i sprawdzenie aktualnego katalogu

Moduł os posiada wbudowane funkcje chdir i getcwd umożliwiające odpowiednio zmianę i sprawdzenie aktualnej ścieżki.

import os
os.chdir('d:\\skany')
print(os.getcwd())

Listowanie zawartości katalogu

Sprowadza się to do wywołania funkcji listdir:

print(os.listdir())

W efekcie uzyskamy zarówno pliki jak i katalogi w postaci jednej listy:

['201911161539.pdf', 'archiwum', 'nowe']

Sprawdzenie czy katalog istnieje

Sprowadza się to do wywołania funkcji exists:

import os
if os.path.exists('d:\\skany'):
    print('jest taki katalog')
else:
    print('nie ma takiego katalogu')

Sprawdzanie czy mamy do czynienia z plikiem czy z katalogiem

Moduł os ma dwie funkcje które umożliwią nam spełnić takie wymaganie - isdir i isfile weryfikujące odpowiednio czy mamy do czynienia z katalogiem czy z plikiem:

import os
if os.path.isdir('d:\\skany'):
    print('to jest katalog')
else:
    print('to jest plik')

if os.path.isfile('d:\\skany\\201907111505.pdf'):
    print('to jest plik')
else:
    print('to jest katalog')

Sprawdzanie wielkości pliku

Stosujemy funkcję getsize:

import os
size=os.path.getsize('d:\\skany\\201907111505.pdf')
print(f'wielkość pliku={size} bajtów')

Efekt na konsoli:

wielkość pliku=1262625 bajtów

Tworzenie i kasowanie katalogu

Istnieją do tego funkcje odpowiednio mkdir i rmdir

import os
os.mkdir('d:\\skany\\nowe')
os.rmdir('d:\\skany\\nowe')

Kasowanie pliku

Sprowadza się do wywołania funkcji remove:

import os
os.remove(‘d:\\skany\\201907111505.pdf’)

Nowocześnie: moduł pathlib zamiast sklejania ścieżek

Pokazane wyżej funkcje z modułów "os" i "os.path" działają i są wszędzie, ale operują na ścieżkach jak na zwykłym tekście - a sklejanie ścieżek z tekstu łatwo psuje się między systemami (Windows i Linux używają innego separatora katalogów). Nowocześniejszym podejściem jest moduł "pathlib", w którym ścieżka to obiekt, a łączenie katalogów zapisujemy operatorem "/":

from pathlib import Path

katalog = Path('d:/skany')
plik = katalog / 'raport.txt'

print(plik)                 # cała ścieżka
print(plik.name)            # sama nazwa pliku
print(plik.suffix)          # rozszerzenie
print(katalog.exists())     # czy katalog istnieje
print(plik.parent)          # katalog nadrzędny

Obiekt Path sam dba o poprawny separator w danym systemie, a metody takie jak "exists", "is_dir", "name", "suffix" czy "parent" zastępują funkcje z "os.path" w czytelniejszej formie. Zawartość katalogu wypiszemy jedną pętlą, bez osobnej funkcji "listdir":

for element in Path('d:/skany').iterdir():
    print('katalog:' if element.is_dir() else 'plik:   ', element.name)

Moduł "os" nadal jest potrzebny do rzeczy systemowych (zmienne środowiskowe, uruchamianie procesów), ale do samego poruszania się po plikach i katalogach "pathlib" jest dziś domyślnym wyborem.

Komentarze (0)

Musisz być zalogowany by móc dodać komentarz. Zaloguj się przez Google

Brak komentarzy...