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
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.
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.
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
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é:
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)
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')
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é.