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:

Funkcja os.walk: Moduł os w Pythonie

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:

Funkcja os.walk: Moduł os w Pythonie (2)

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:

Funkcja os.walk: Moduł os w Pythonie (3)

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.

Szkolenie Python od podstaw, przez analizę danych, do machine learning w JSystems

Ten kurs daje Ci solidne podstawy Pythona. Jeśli chcesz pójść dalej i pod okiem trenera dojść od pierwszej linijki kodu do własnego modelu uczenia maszynowego, sprawdź nasze pięciodniowe szkolenie Python od podstaw, przez analizę danych, do machine learning. Pierwsze trzy dni to Python w praktyce: typy i kolekcje, instrukcje warunkowe i pętle, funkcje, moduły i pakiety, pliki tekstowe, usługi sieciowe oraz praca z bazą PostgreSQL. Czwarty dzień to analiza danych w pandas (wczytywanie CSV, TSV i XLS, filtrowanie, agregacje, statystyki) i wizualizacja w Matplotlib, Seaborn oraz Plotly. Piąty dzień to uczenie maszynowe w scikit-learn: regresja liniowa i logistyczna, drzewa decyzyjne, las losowy, XGBoost, walidacja predykcji, dobór hiperparametrów i przeciwdziałanie przeuczeniu. Szkolenie ma terminy gwarantowane, czyli odbywa się niezależnie od wielkości grupy.

Szkolenie Python od podstaw, przez analizę danych, do machine learning

To szkolenie może być dofinansowane dla Ciebie z KFS lub BUR.

★★★★★Średnia ocena naszych szkoleń w Google: 5/5

Najczęściej zadawane pytania

Do czego służy funkcja os.walk?
os.walk pozwala przeszukiwać katalogi. Jako argument przyjmuje ścieżkę startową, a potem umożliwia iterację po wynikach. Dla każdego katalogu zwraca krotkę: ścieżkę bieżącego katalogu, listę podkatalogów oraz listę plików. Działa rekurencyjnie, więc wchodzi w głąb wszystkich katalogów.
Jak w module os sprawdzić, czy ścieżka to plik czy katalog?
Służą do tego funkcje os.path.isdir oraz os.path.isfile, które sprawdzają, czy podana ścieżka jest odpowiednio katalogiem czy plikiem. Istnienie ścieżki weryfikuje os.path.exists, a rozmiar pliku w bajtach zwraca os.path.getsize.
Jak poruszać się po systemie plików modułem os?
Aktualny katalog zmieniamy funkcją chdir, a sprawdzamy go funkcją getcwd. Zawartość katalogu (pliki i podkatalogi razem, jako jedna lista) zwraca listdir. Do tworzenia i kasowania katalogów służą mkdir i rmdir, a plik usuwamy funkcją remove.
Czym pathlib jest lepszy od sklejania ścieżek jako tekstu?
Funkcje z os i os.path traktują ścieżki jak zwykły tekst, a sklejanie tekstu łatwo psuje się między systemami, bo Windows i Linux używają innego separatora katalogów. W pathlib ścieżka jest obiektem, katalogi łączymy operatorem ukośnika, a obiekt sam dba o poprawny separator w danym systemie.
Czy pathlib całkowicie zastępuje moduł os?
Do samego poruszania się po plikach i katalogach pathlib jest dziś domyślnym wyborem, bo metody takie jak exists, is_dir, name, suffix czy parent są czytelniejsze. Moduł os pozostaje potrzebny do zadań systemowych, na przykład obsługi zmiennych środowiskowych czy uruchamiania procesów.

Komentarze (0)

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

Brak komentarzy...