99 votes

Barres obliques mélangées avec os.path.join sur Windows

Je tends à n'utiliser que des barres obliques pour les chemins ('/') et Python est heureux avec cela aussi sous Windows.

Dans la description de os.path.join, il est dit que c'est la manière correcte si vous voulez être cross-platform. Mais quand je l'utilise, j'obtiens des barres obliques mélangées :

import os

a = 'c:/'
b = 'myFirstDirectory/'
c = 'mySecondDirectory'
d = 'myThirdDirectory'
e = 'myExecutable.exe'

print os.path.join(a, b, c, d, e)

# Résultat :
c:/myFirstDirectory/mySecondDirectory\myThirdDirectory\myExecutable.exe

Est-ce correct ? Devrais-je vérifier et corriger ensuite ou y a-t-il une meilleure manière ?

Merci

EDIT: J'obtiens aussi des barres obliques mélangées lorsque je demande les chemins

import sys
for item in sys.path:
    print item

# Résultat :
C:\Program Files\Autodesk\Maya2013.5\bin
C:\Program Files\Autodesk\Maya2013.5\mentalray\scripts\AETemplates
C:\Program Files\Autodesk\Maya2013.5\Python
C:\Program Files\Autodesk\Maya2013.5\Python\lib\site-packages
C:\Program Files\Autodesk\Maya2013.5\bin\python26.zip\lib-tk
C:/Users/nookie/Documents/maya/2013.5-x64/prefs/scripts
C:/Users/nookie/Documents/maya/2013.5-x64/scripts
C:/Users/nookie/Documents/maya/scripts
C:\Program Files\Nuke7.0v4\lib\site-packages
C:\Program Files\Nuke7.0v4/plugins/modules

72voto

Maximus Points 934

Vous pouvez utiliser .replace() après path.join() pour vous assurer que les barres obliques sont correctes :

# Remplacer tous les backslashes par des slashes
print os.path.join(a, b, c, d, e).replace("\\","/")

Cela donne en sortie :

c:/monPremierRépertoire/monDeuxièmeRépertoire/monTroisièmeRépertoire/monExécutable.exe

Comme @sharpcloud l'a suggéré, il serait préférable de supprimer les barres obliques de vos chaînes d'entrée, cependant ceci est une alternative.

44voto

sharpcloud Points 4141

Vous fournissez maintenant certaines barres obliques vous-même et laissez os.path.join choisir les autres. Il vaut mieux laisser python choisir toutes les barres ou les fournir toutes vous-même. Python utilise des barres obliques pour la dernière partie du chemin, car les barres obliques sont la valeur par défaut sur Windows.

import os

a = 'c:' // barre oblique supprimée
b = 'myFirstDirectory' // barre oblique supprimée
c = 'mySecondDirectory'
d = 'myThirdDirectory'
e = 'myExecutable.exe'

print os.path.join(a + os.sep, b, c, d, e)

Je n'ai pas testé cela, mais j'espère que cela aide. Il est plus courant d'avoir un chemin de base et de devoir joindre uniquement un autre élément, principalement des fichiers.

En passant; vous pouvez utiliser os.sep pour ces moments où vous voulez avoir le meilleur séparateur pour le système d'exploitation sur lequel python est en cours d'exécution.

Édition: comme le déclare dash-tom-bang, apparemment pour Windows, vous devez inclure un séparateur pour la racine du chemin. Sinon, vous créez un chemin relatif au lieu d'un chemin absolu.

19voto

Andre Odendaal Points 679

Essayez d'utiliser abspath (en utilisant python 3)

import os

a = 'c:/'
b = 'monPremierRépertoire/'
c = 'monDeuxièmeRépertoire'
d = 'monTroisièmeRépertoire'
e = 'monExecutable.exe'

print(os.path.abspath(os.path.join(a, b, c, d, e)))

RESULTAT :

c:\monPremierRépertoire\monDeuxièmeRépertoire\monTroisièmeRépertoire\monExecutable.exe

Processus terminé avec le code de sortie 0

9voto

oriadam Points 3663

EDIT basé sur le commentaire: chemin = os.path.normpath(chemin)

Ma réponse précédente manque la capacité de gérer les caractères d'échappement et donc ne doit pas être utilisée:

  • First, convertissez le chemin en un tableau de dossiers et de nom de fichier.
  • Deuxièmement, les recoller ensemble en utilisant le symbole correct.

    import os   
    chemin = 'c:\www\app\my/folder/file.php'
    # séparez le chemin en parties par le symbole slash:
    chemin = re.compile(r"[\/]").split(chemin)
    # joignez le chemin en utilisant le bon symbole de slash:
    chemin = os.path.join(*chemin)

9voto

dinosaurwaltz Points 1100

Si pour une raison quelconque vous devez fournir les chemins vous-même et que vous utilisez quelque chose au-dessus de python 3.4, vous pouvez utiliser pathlib

from pathlib import Path, PurePosixPath

a = PurePosixPath('c:/')
b = PurePosixPath('myFirstDirectory/')
c = 'mySecondDirectory'
d = 'myThirdDirectory'
e = 'myExecutable.exe'

print(a / b / c / d / e)

# Résultat
c:/myFirstDirectory/mySecondDirectory/myThirdDirectory/myExecutable.exe

J'ai utilisé ceci lorsque j'avais besoin qu'un utilisateur fournisse l'emplacement d'un répertoire de ressources et que mon code utilisait des chaînes de chemin Windows

In [1]: from pathlib import Path, PureWindowsPath
In [2]: USER_ASSETS_DIR = Path('/asset/dir') # l'utilisateur fournit cela sous forme de variable d'environnement
In [3]: SPECIFIC_ASSET = PureWindowsPath('some\\asset')
In [4]: USER_ASSETS_DIR / SPECIFIC_ASSET

Out[4]: PosixPath('/asset/dir/some/asset')

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