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 /.
Porównanie w tabeli
#Reprezentacja ścieżki
Łączenie części ścieżki
Nazwa pliku i rozszerzenie
Odczyt i zapis pliku
Zmienne środowiskowe
Typowe użycie
Przykład
#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)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
#import os
os.path.join("a", "b.txt")
from pathlib import Path
Path("a") / "b.txt"Więcej przykładów
#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))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")Dobre praktyki
#- Nie sklejaj ścieżek operatorem
+i ukośnikami wpisanymi na sztywno.os.path.join()albopathlibwstawią separator właściwy dla systemu. - Obiekt
Pathmożesz przekazać bezpośrednio doopen()i większości funkcji przyjmujących ścieżkę. Na napis zamienisz go przezstr(). - Hasła i klucze API trzymaj w zmiennych środowiskowych i odczytuj przez
os.environ.get(), niezależnie od tego, czy resztę ścieżek obsługujeosczypathlib.
Powiązane hasła
#- osWspółpraca z systemem operacyjnym: ścieżki, katalogi, pliki i zmienne środowiskowe.
- pathlibŚcieżki jako obiekty: łączenie operatorem /, odczyt części ścieżki oraz praca z plikami.
- open()Otwiera plik do odczytu lub zapisu i zwraca obiekt pliku.
- withMenedżer kontekstu: automatyczne przygotowanie i sprzątanie zasobów.
Widzisz błąd albo brakuje przykładu? Napisz do nas.