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 ?

7voto

georg Points 325

Je dirais qu'il s'agit d'un bug de (Windows)python.

Pourquoi un insecte ?

Je pense que cette déclaration devrait être True

os.path.join(*os.path.dirname(os.path.abspath(__file__)).split(os.path.sep))==os.path.dirname(os.path.abspath(__file__))

Mais c'est False sur les machines Windows.

6voto

ghostdog74 Points 86060

Pour rejoindre un chemin Windows, essayez

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

En fait, vous devrez échapper à la barre oblique

4voto

Marco Gomez Points 189

Vous avez plusieurs approches possibles pour traiter les chemins d'accès sous Windows, des plus codées (comme l'utilisation de chaînes littérales brutes ou l'échappement des barres obliques inverses) aux moins codées. Voici quelques exemples qui fonctionneront comme prévu. Utilisez ce qui correspond le mieux à vos besoins.

In[1]: from os.path import join, isdir

In[2]: from os import sep

In[3]: isdir(join("c:", "\\", "Users"))
Out[3]: True

In[4]: isdir(join("c:", "/", "Users"))
Out[4]: True

In[5]: isdir(join("c:", sep, "Users"))
Out[5]: True

1voto

Alex Fedorov Points 119

Si vous souhaitez obtenir un chemin correct de manière pragmatique, utilisez os.path.abspath :

os.path.abspath(os.path.join(root, 'sourcedir'))

Sous Windows :

>>> os.path.abspath(os.path.join('C:\\', 'sourcedir'))
'C:\\sourcedir'

>>> os.path.abspath(os.path.join('C:', 'sourcedir'))
'C:\\sourcedir'

Sous Linux :

>>> os.path.abspath(os.path.join('/', 'sourcedir'))
'/sourcedir'

1voto

SIslam Points 4075

Consentement avec @georg-

Je dirais alors pourquoi nous avons besoin de boiteux os.path.join - mieux vaut utiliser str.join ou unicode.join par exemple

sys.path.append('{0}'.join(os.path.dirname(__file__).split(os.path.sep)[0:-1]).format(os.path.sep))

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