web-dev-qa-db-fra.com

slash mélangé avec os.path.join sur Windows

J'ai tendance à n'utiliser que des barres obliques pour les chemins ('/') et python en est également satisfait sur Windows. Dans la description de os.path.join, il est dit que c'est la bonne manière si vous voulez aller multi-plateforme, mais quand je l'utilise, je reçois des slashs mixtes:

import os

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


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

# Result:
c:/myFirstDirectory/mySecondDirectory\myThirdDirectory\myExecutable.exe

Est-ce correct? Devrais-je vérifier et corriger après ou sinon il y a une meilleure façon?

Merci

EDIT: Je reçois aussi des barres mixtes lorsque je demande des chemins

import sys
for item in sys.path:
    print item

# Result:
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
51
nookie

Vous fournissez maintenant certaines des barres obliques et laissez os.path.join en choisir d'autres. Il est préférable de laisser python tous les sélectionner ou de les fournir tous vous-même. Python utilise des barres obliques inverses pour la dernière partie du chemin, car les barres obliques inversées sont les valeurs par défaut). Les fenêtres.

import os

a = 'c:' # removed slash
b = 'myFirstDirectory' # removed slash
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 ne devoir rejoindre qu'un autre élément, principalement des fichiers.

Au fait; vous pouvez utiliser os.sep pour les moments où vous souhaitez avoir le meilleur séparateur pour le système d'exploitation python est en cours d'exécution.

Edit: en tant qu'états 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.

29
pyrocumulus

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

# .replace() all backslashes with forwardslashes
print os.path.join(a, b, c, d, e).replace("\\","/")

Cela donne la sortie:

c:/myFirstDirectory/mySecondDirectory/myThirdDirectory/myExecutable.exe

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

34
Maximus

essayez d'utiliser abspath (en utilisant python 3)

import os

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


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

SORTIE:

c:\myFirstDirectory\mySecondDirectory\myThirdDirectory\myExecutable.exe

Processus terminé avec le code de sortie 0

10
Andre Odendaal

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

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

  • Commencez par convertir le chemin en un tableau de dossiers et un nom de fichier.
  • Deuxièmement, les coller ensemble en utilisant le symbole correct.

    import os   
    path = 'c:\www\app\my/folder/file.php'
    # split the path to parts by either slash symbol:
    path = re.compile(r"[\/]").split(path)
    # join the path using the correct slash symbol:
    path = os.path.join(*path)
    
8
oriadam

Si, pour une raison quelconque, vous devez fournir les chemins vous-même et que vous utilisez l'une des options ci-dessus 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)

# Result
c:/myFirstDirectory/mySecondDirectory/myThirdDirectory/myExecutable.exe

Je l'utilisais quand j'avais besoin d'un utilisateur pour fournir l'emplacement d'un répertoire d'actifs et mon code cherchait en utilisant des chaînes de chemin Windows

In [1]: from pathlib import Path, PureWindowsPath
In [2]: USER_ASSETS_DIR = Path('/asset/dir') # user provides this form environment variable
In [3]: SPECIFIC_ASSET = PureWindowsPath('some\\asset')
In [4]: USER_ASSETS_DIR / SPECIFIC_ASSET

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

os ajoute des barres obliques pour vous et veille à ne pas les dupliquer, donc omettez-les dans vos chaînes

import os

# Don't add your own slashes
a = 'C:'
b = 'myFirstDirectory' 
c = 'mySecondDirectory'
d = 'myThirdDirectory'
e = 'myExecutable.exe'

print os.path.join(a, b, c, d, e)
C:\myFirstDirectory\mySecondDirectory\myThirdDirectory\myExecutable.exe

Supplémentaire:

Je ne sais pas pourquoi vous avez mélangé des barres obliques dans votre chemin système (avez-vous utilisé un système d'exploitation Linux pour ajouter des dossiers?), Mais essayez de vérifier

print os.path.isdir(os.path.join('C:','Users','nookie')).

S'il s'agit de True, alors os fonctionne pour vos slash mixtes.

De toute façon, j'éviterais de coder en dur les noms de répertoires dans votre programme. Votre boucle sys.path For est un moyen sûr d'extraire ces répertoires. Vous pouvez ensuite utiliser certaines méthodes de chaîne ou regex pour choisir le dossier souhaité.

2
ejrb