web-dev-qa-db-fra.com

Comment obtenir le chemin absolu d'un objet pathlib.Path?

Créer un objet chemin avec le module pathlib comme:

p = pathlib.Path('file.txt')

L'objet p pointera sur un fichier du système de fichiers, car je peux faire par exemple p.read_text().

Comment puis-je obtenir le chemin absolu de l'objet p dans une chaîne?

Apparemment, je peux utiliser par exemple os.path.abspath(p) pour obtenir le chemin absolu, mais il est difficile d’utiliser une méthode os.path, Car je suppose que pathlib devrait remplacer os.path.

29
EquipDev

Vous cherchez la méthode .absolute, si ma compréhension est correcte, la documentation de qui est écrit:

>>> print(p.absolute.__doc__)
Return an absolute version of this path.  This function works
        even if the path doesn't point to anything.

        No normalization is done, i.e. all '.' and '..' will be kept along.
        Use resolve() to get the canonical path to a file.

Avec un fichier de test sur mon système, cela retourne:

>>> p = pathlib.Path('testfile')
>>> p.absolute()
PosixPath('/home/jim/testfile')

Cette méthode semble être une nouvelle, et toujours, ajout non documenté à Path et Path objets hérités.

Création d'un problème pour documenter cela .

29

Utilisez resol ()

Utilisez simplement Path.resolve () comme ceci:

p = p.resolve()

Cela rend votre chemin absolu et remplace toutes les parties relatives par des parties absolues.

Évitez absolu ()

Vous devriez ne pas utiliserabsolute() (qui fait presque la même chose) car elle n'est pas documentée, ni testée ni prise en compte. (Voir la discussion dans le rapport de bogue créé par @Jim Fasarakis Hilliard).

La différence est que absolute () ne remplace pas les parties relatives du chemin et ne soulève jamais FileNotFoundError.

Attention FileNotFoundError

Sur Python antérieures à la v3.6, resolve()) lève un FileNotFoundError si le chemin n'est pas présent sur le disque.

Donc, s'il y a un risque, vérifiez d'abord avec p.exists() ou essayez/corrigez l'erreur.

# check beforehand
if p.exists():
    p = p.resolve()

# or catch afterward
try:
    p = p.resolve()
catch FileNotFoundError:
    # deal with the missing file here
    pass

Si vous traitez avec un chemin qui n'est pas sur le disque pour commencer, et que vous n'êtes pas sur Python 3.6+, il est préférable de revenir à os.path.abspath(str(p)).

À partir de la version 3.6, resolve() ne soulève FileNotFoundError que si vous utilisez l'argument strict.

# might raise FileNotFoundError
p = p.resolve(strict=True)

Mais attention, l'utilisation de strict rend votre code incompatible avec les versions de Python antérieures à 3.6 car celles-ci n'acceptent pas cet argument.

63
florisla

Si vous voulez simplement le chemin et ne voulez pas vérifier si le fichier existe, vous pouvez le faire

str(p)

en tant que document dans la section Opérations .

1
Veech