pathlib

Ścieżki jako obiekty: łączenie operatorem /, odczyt części ścieżki oraz praca z plikami.

Na tej stronie

Przykład

#
Python
from pathlib import Path

lesson = Path("kursy") / "python" / "lekcja_01.py"

print(lesson)
print(lesson.name)
print(lesson.stem, lesson.suffix)
print(lesson.parent)
print(lesson.with_suffix(".md"))
Wynikzapisany wynik, możesz go sprawdzić
kursy/python/lekcja_01.py
lekcja_01.py
lekcja_01 .py
kursy/python
kursy/python/lekcja_01.md

Wynik dla Linuksa i macOS. W systemie Windows ścieżki zostaną wypisane z ukośnikami wstecznymi, np. kursy\python\lekcja_01.py.

Definicja i zastosowanie

#

Moduł pathlib reprezentuje ścieżki jako obiekty klasy Path, a nie zwykłe napisy. Kolejne części łączy się operatorem /: Path("kursy") / "python". Separator jest dobierany automatycznie, więc ten sam kod działa w systemach Windows, Linux i macOS.

Obiekt ścieżki ma atrybuty opisujące jej części: name (pełna nazwa pliku), stem (nazwa bez rozszerzenia), suffix (rozszerzenie) i parent (katalog nadrzędny). Metody takie jak with_suffix() czy with_name() tworzą nowe ścieżki bez dotykania dysku.

Pozostałe metody działają już na plikach: exists(), is_file(), mkdir(), read_text(), write_text(), unlink() (usunięcie pliku) oraz glob() i rglob() do wyszukiwania plików według wzorca. W nowym kodzie pathlib jest zalecaną alternatywą dla funkcji z os.path.

Składnia

#
Składnia
from pathlib import Path

Path("katalog") / "plik.txt"
sciezka.name, sciezka.stem, sciezka.suffix, sciezka.parent
sciezka.read_text(encoding="utf-8")
sciezka.write_text(tekst, encoding="utf-8")
sciezka.glob(wzorzec)

Więcej przykładów

#
Zapis i odczyt pliku tekstowego
Python
from pathlib import Path

notes = Path("notatki.txt")
notes.write_text("Pętla for\nSłowniki\n", encoding="utf-8")

print(notes.exists())
print(notes.read_text(encoding="utf-8").splitlines())

notes.unlink()
print(notes.exists())
Wynikzapisany wynik, możesz go sprawdzić
True
['Pętla for', 'Słowniki']
False
Tworzenie katalogów i wyszukiwanie plików
Python
from pathlib import Path

src = Path("projekt") / "src"
src.mkdir(parents=True, exist_ok=True)

for name in ["main.py", "utils.py", "README.md"]:
    (src / name).write_text("", encoding="utf-8")

print(sorted(path.name for path in Path("projekt").rglob("*.py")))
Wynikzapisany wynik, możesz go sprawdzić
['main.py', 'utils.py']

Wynik zakłada, że katalog projekt wcześniej nie istniał albo nie zawierał innych plików .py.

Dobre praktyki

#
  • Przy read_text() i write_text() zawsze podawaj encoding="utf-8", żeby polskie znaki działały tak samo w każdym systemie.
  • Obiekt Path możesz przekazać bezpośrednio do open() i większości funkcji przyjmujących ścieżkę. Na napis zamienisz go przez str().
  • Path.cwd() zwraca bieżący katalog, a Path.home() katalog domowy użytkownika.

Powiązane hasła

#

Widzisz błąd albo brakuje przykładu? Napisz do nas.