Path.resolve(), absolute(), relative_to() și verificările de cale în Python

Căi (pathlib) Python 3.4+ (is_relative_to: 3.9+, walk_up: 3.12+)

Transformă căile în căi absolute sau relative și le compară.

Sintaxă
p.resolve(strict=False)
p.absolute()
p.expanduser()
p.relative_to(alta, *, walk_up=False)
p.is_relative_to(alta)
p.is_absolute()
p.samefile(alta)

Ce face Path.resolve(), absolute(), relative_to() și verificările de cale

resolve() dă calea absolută, cu legăturile simbolice și .. rezolvate. absolute() doar adaugă directorul curent în față, fără să rezolve nimic. expanduser() înlocuiește ~. is_absolute() verifică dacă o cale este absolută, iar samefile() dacă două căi indică același fișier.

relative_to(baza) dă calea relativă față de baza și aruncă ValueError dacă nu se află sub ea; cu walk_up=True (3.12+) poate urca cu ... is_relative_to() (3.9+) verifică dacă o cale se află sub alta, util pentru a bloca accesul în afara unui director permis. is_reserved() verifică numele rezervate din Windows (NUL, CON), dar este învechită din 3.13; folosește os.path.isreserved().

Ce returnează

Căi noi, sau True/False pentru verificări.

Exemple

Exemplul 1: Căi relative și verificare de securitate

from pathlib import PurePosixPath as P
from os.path import normpath
radacina = P("/srv/site/public")
for cerut in ["img/logo.png", "../../etc/passwd"]:
    cale = P(normpath(radacina / cerut))
    print(cale, cale.is_relative_to(radacina))
print(P("/srv/site/public/css/a.css").relative_to(radacina))
print(P("/srv/backup").relative_to(radacina, walk_up=True))
print(P("/etc").is_absolute(), P("date").is_absolute())

Rezultat

/srv/site/public/img/logo.png True
/srv/etc/passwd False
css/a.css
../../backup
True False

Exemplul 2: resolve, absolute, samefile

from pathlib import Path
Path("doc.txt").touch()
Path("scurt").symlink_to("doc.txt")
print(Path("scurt").resolve().name, Path("scurt").absolute().name)
print(Path("scurt").samefile("doc.txt"))
print(Path("./a/../doc.txt").resolve() == Path("doc.txt").resolve())
import os
os.environ["HOME"] = "/home/ana"
print(Path("~/poze").expanduser())

Rezultat

doc.txt scurt
True
True
/home/ana/poze

Exemplul 3: Nume rezervate în Windows (metodă învechită)

from pathlib import PureWindowsPath
print(PureWindowsPath("nul").is_reserved())

Rezultat (cu avertismentul afișat de Python 3.13+)

exemplu.py:2: DeprecationWarning: pathlib.PurePath.is_reserved() is deprecated and scheduled for removal in Python 3.15. Use os.path.isreserved() to detect reserved paths on Windows.
True

Greșeli frecvente

  • Verifici că o cale cerută de utilizator este sub directorul permis fără să rezolvi ... /srv/public/../../etc trece de un test pe text; rezolvă calea întâi.

Comenzi înrudite