PorównaniePorównania

os vs pathlib

moduł os reprezentuje ścieżki jako zwykłe napisy i operuje na nich funkcjami, a pathlib reprezentuje ścieżkę jako obiekt Path z metodami i operatorem /.

Na tej stronie

Porównanie w tabeli

#
  • Reprezentacja ścieżki

    os
    Zwykły napis
    pathlib
    Obiekt klasy Path
  • Łączenie części ścieżki

    os
    os.path.join(a, b)
    pathlib
    Operator /: a / b
  • Nazwa pliku i rozszerzenie

    os
    Funkcje os.path.basename(), os.path.splitext()
    pathlib
    Atrybuty .name, .stem, .suffix
  • Odczyt i zapis pliku

    os
    Przez wbudowany open()
    pathlib
    Metody .read_text(), .write_text()
  • Zmienne środowiskowe

    os
    os.environ
    pathlib
    Brak, nadal potrzebny os
  • Typowe użycie

    os
    Starszy kod, zmienne środowiskowe
    pathlib
    Nowy kod operujący na ścieżkach i plikach

Przykład

#
Python
import os
from pathlib import Path

os_path = os.path.join("kursy", "python", "lekcja_01.py")
path_obj = Path("kursy") / "python" / "lekcja_01.py"

print(os_path)
print(path_obj)
print(os.path.basename(os_path), path_obj.name)
Wynikzapisany wynik, możesz go sprawdzić
kursy/python/lekcja_01.py
kursy/python/lekcja_01.py
lekcja_01.py lekcja_01.py

Wynik dla Linuksa i macOS. W systemie Windows obie ścieżki wypisałyby się z ukośnikami wstecznymi.

Definicja i zastosowanie

#

Oba służą do tych samych zadań: budowania ścieżek niezależnie od systemu operacyjnego, sprawdzania, czy plik istnieje, odczytu nazwy pliku czy rozszerzenia. Obie działają poprawnie na Windows, Linuksie i macOS, bo same dobierają właściwy separator.

Różnią się stylem. W os.path ścieżka to zwykły napis, a operacje to osobne funkcje, które go przyjmują i zwracają: os.path.join(a, b), os.path.basename(sciezka). W pathlib ścieżka jest obiektem klasy Path, a kolejne części łączysz operatorem /, a jej cechy odczytujesz jako atrybuty: sciezka.name, sciezka.suffix. Operacje na plikach, takie jak odczyt czy zapis, w pathlib są metodami tego samego obiektu, a w os rozdzielone są między os i wbudowany open().

W nowym kodzie zalecany jest pathlib: jest bardziej czytelny i obiektowy, a jedna zmienna Path niesie ze sobą wszystkie operacje. Moduł os wciąż jest potrzebny do rzeczy, których pathlib nie robi, np. zmiennych środowiskowych (os.environ), i spotkasz go w starszym kodzie.

Składnia

#
Składnia
import os
os.path.join("a", "b.txt")

from pathlib import Path
Path("a") / "b.txt"

Więcej przykładów

#
Rozszerzenie i katalog nadrzędny
Python
from pathlib import Path
import os

path_obj = Path("projekt") / "notatki.md"
os_path = os.path.join("projekt", "notatki.md")

print(path_obj.suffix, path_obj.parent)
print(os.path.splitext(os_path)[1], os.path.dirname(os_path))
Wynikzapisany wynik, możesz go sprawdzić
.md projekt
.md projekt
Odczyt i zapis pliku: open() a metody Path
Python
import os
from pathlib import Path

notes = Path("notatki_pathlib.txt")
notes.write_text("Pętla for\n", encoding="utf-8")
print(notes.read_text(encoding="utf-8").strip())
notes.unlink()

with open("notatki_os.txt", "w", encoding="utf-8") as file:
    file.write("Pętla for\n")
with open("notatki_os.txt", encoding="utf-8") as file:
    print(file.read().strip())
os.remove("notatki_os.txt")
Wynikzapisany wynik, możesz go sprawdzić
Pętla for
Pętla for

Dobre praktyki

#
  • Nie sklejaj ścieżek operatorem + i ukośnikami wpisanymi na sztywno. os.path.join() albo pathlib wstawią separator właściwy dla systemu.
  • Obiekt Path możesz przekazać bezpośrednio do open() i większości funkcji przyjmujących ścieżkę. Na napis zamienisz go przez str().
  • Hasła i klucze API trzymaj w zmiennych środowiskowych i odczytuj przez os.environ.get(), niezależnie od tego, czy resztę ścieżek obsługuje os czy pathlib.

Powiązane hasła

#

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