119 votes

Python os.path.join sur Windows

J'essaie d'apprendre le langage python et je crée un programme qui produira un script. Je veux utiliser os.path.join, mais je suis assez confus. D'après le documents si je dis :

os.path.join('c:', 'sourcedir')

J'obtiens "C:sourcedir" . D'après les docteurs, c'est normal, n'est-ce pas ?

Mais lorsque j'utilise la commande copytree, Python l'affiche de la manière souhaitée, par exemple :

import shutil
src = os.path.join('c:', 'src')
dst = os.path.join('c:', 'dst')
shutil.copytree(src, dst)

Voici le code d'erreur que j'obtiens :

WindowsError: \[Error 3\] The system cannot find the path specified: 'C:src/\*.\*'

Si j'enveloppe le os.path.join con os.path.normpath J'obtiens la même erreur.

Si cette os.path.join ne peut pas être utilisé de cette manière, je ne comprends pas très bien sa raison d'être.

D'après les pages proposées par Stack Overflow, les slashs ne doivent pas être utilisés dans les jointures - c'est correct, je suppose ?

153voto

AndreasT Points 2329

Pour être encore plus pédant, la réponse la plus cohérente du doc Python serait la suivante :

mypath = os.path.join('c:', os.sep, 'sourcedir')

Puisque vous avez également besoin de os.sep pour le chemin d'accès à la racine posix :

mypath = os.path.join(os.sep, 'usr', 'lib')

72voto

Windows a un concept de répertoire courant pour chaque lecteur. C'est la raison pour laquelle, "c:sourcedir" signifie "sourcedir" dans le répertoire C : actuel, et vous devrez spécifier un répertoire absolu.

N'importe laquelle de ces solutions devrait fonctionner et donner le même résultat, mais je n'ai pas de VM Windows allumée pour l'instant afin de vérifier :

"c:/sourcedir"
os.path.join("/", "c:", "sourcedir")
os.path.join("c:/", "sourcedir")

17voto

Matt Ball Points 594

Pour être pédant, il n'est probablement pas bon de coder en dur / ou \ comme séparateur de chemin. Peut-être que ceci serait mieux ?

mypath = os.path.join('c:%s' % os.sep, 'sourcedir')

ou

mypath = os.path.join('c:' + os.sep, 'sourcedir')

16voto

Scott Gigante Points 573

Pour une solution agnostique qui fonctionne à la fois sous Windows et Linux, quel que soit le chemin d'entrée, on peut utiliser

def joinpath(rootdir, targetdir):
    return os.path.join(os.sep, rootdir + os.sep, targetdir)

Sous Windows :

>>> joinpath("C:", "Windows")
'C:\\Windows'
>>> joinpath("C:\\Windows", "src")
'C:\\Windows\\src'

Sous Linux :

>>> joinpath("usr", "lib")
'/usr/lib'
>>> joinpath("/usr/lib", "src")
'/usr/lib/src'

14voto

Smashery Points 13208

La raison os.path.join('C:', 'src') ne fonctionne pas comme vous le souhaitez est due à un élément de la documentation dont vous avez donné le lien :

Notez que sous Windows, si répertoire courant pour chaque lecteur, os.path.join("c :", "foo") représente un chemin chemin relatif au répertoire courant sur le lecteur C : (c:foo), et non c : \foo.

Comme l'a dit ghostdog, vous voudrez probablement mypath=os.path.join('c:\\', 'sourcedir')

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X