Ces dernières chaînes ne doivent pas commencer par une barre oblique. S'ils commencent par une barre oblique, ils sont alors considérés comme un "chemin absolu" et tout ce qui se trouve devant eux est rejeté.
Citant les documents Python pouros.path.join
:
Si un composant est un chemin absolu, tous les composants précédents sont supprimés et la jointure continue à partir du composant de chemin absolu.
Remarque sur Windows, le comportement par rapport aux lettres de lecteur, qui semble avoir changé par rapport aux versions antérieures de Python:
Sous Windows, la lettre de lecteur n'est pas réinitialisée lorsqu'un composant de chemin absolu (par exemple, r'\foo'
) est rencontré. Si un composant contient une lettre de lecteur, tous les composants précédents sont jetés et la lettre de lecteur est réinitialisée. Notez qu'étant donné qu'il existe un répertoire en cours pour chaque lecteur, il os.path.join("c:", "foo")
représente un chemin relatif au répertoire en cours sur le lecteur C:
( c:foo
), non c:\foo
.
os.path.normpath
pour atteindre cet objectif.L'idée
os.path.join()
est de rendre votre programme multi-plateforme (linux / windows / etc).Même une barre oblique la ruine.
Cela n'a donc de sens que lorsqu'il est utilisé avec une sorte de point de référence comme
os.environ['HOME']
ouos.path.dirname(__file__)
.la source
os.path.join()
peut être utilisé conjointement avecos.path.sep
pour créer un chemin absolu plutôt que relatif.la source
os.path.sep
comme premier élément pour construire un chemin absolu est meilleure que toute autre réponse ici! L'intérêt d'utiliseros.path
des méthodes str plutôt que de base est d'éviter d'écrire/
. Placer chaque sous-répertoire en tant que nouvel argument et supprimer toutes les barres obliques est également excellent. Ce serait probablement une bonne idée de s'assurer avec un chèque quitodaystr
ne commence pas par une barre oblique! ;)N'utilisez pas de barres obliques au début des composants de chemin, sauf lorsque vous vous référez au répertoire racine:
voir aussi: http://docs.python.org/library/os.path.html#os.path.join
la source
Pour aider à comprendre pourquoi ce comportement surprenant n'est pas entièrement terrible, considérez une application qui accepte un nom de fichier de configuration comme argument:
Si l'application est exécutée avec:
Le fichier de configuration
/etc/myapp.conf/foo.conf
sera utilisé.Mais considérez ce qui se passe si l'application est appelée avec:
Ensuite
myapp
, utilisez le fichier de configuration à/some/path/bar.conf
(et non/etc/myapp.conf/some/path/bar.conf
ou similaire).Ce n'est peut-être pas génial, mais je crois que c'est la motivation pour le comportement absolu du chemin.
la source
C'est parce que votre
'/new_sandbox/'
commence par un/
et est donc supposé être relatif au répertoire racine. Retirez l'interligne/
.la source
Pour rendre votre fonction plus portable, utilisez-la comme telle:
ou
la source
Essayez la combinaison de
split("/")
et*
pour les chaînes avec des jointures existantes.Comment ça fonctionne...
split("/")
transforme le chemin existant en liste:['', 'home', 'build', 'test', 'sandboxes', '']
*
devant la liste éclate chaque élément de la liste de son propre paramètrela source
Essayez avec
new_sandbox
seulementla source
faites comme ça, sans trop de barres obliques
la source
Notez qu'un problème similaire peut vous mordre si vous utilisez
os.path.join()
pour inclure une extension qui inclut déjà un point, ce qui se produit automatiquement lorsque vous utilisezos.path.splitext()
. Dans cet exemple:Même si
extension
peut - être.jpg
vous vous retrouvez avec un dossier nommé « toto » plutôt que d' un fichier appelé « foobar.jpg ». Pour éviter cela, vous devez ajouter l'extension séparément:la source
vous pouvez
strip
le'/'
:la source
Je recommanderais de retirer de la deuxième chaîne et des chaînes suivantes la chaîne
os.path.sep
, en les empêchant d'être interprétés comme des chemins absolus:la source
une version plus complète:
la source
"\"
? Alors votre premier exemple devientos.path.join("a", *"/b".split("\\"))
, ce qui donne"/b"
... Je doute que ce soit le résultat escompté.