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
.
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.
Utilisez simplement Path.resolve () comme ceci:
p = p.resolve()
Cela rend votre chemin absolu et remplace toutes les parties relatives par des parties absolues.
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
.
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.
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 .