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

1voto

ejrb Points 328

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

import os

# Ne rajoutez pas vos propres barres obliques
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 suis pas sûr pourquoi vous avez mélangé les barres obliques dans votre chemin sys (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')).

Si c'est True alors os fonctionne pour vos barres obliques mixtes.

De toute façon, je vous recommande d'éviter de coder en dur les noms de répertoire dans votre programme. Votre boucle sys.path est une manière sûre d'extraire ces répertoires. Ensuite, vous pouvez utiliser des méthodes de chaîne, ou regex pour sélectionner le dossier désiré.

0voto

ashrasmun Points 129

Vous pouvez également faire ceci:

import re

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

joined = os.path.join(a, b, c, d, e)
formatted = re.sub(r'/|\\', re.escape(os.sep), joined)

Cela va transformer toutes vos barres obliques potentiellement mélangées en barres obliques conformes au système d'exploitation.

Je sais que c'est un sujet ancien mais je n'ai pas pu résister. :)

0voto

Alex Points 98

Le client de commande Postgres psql ne prend pas en charge les barres obliques même sous Windows :

>psql -U user -h 111.111.111.111 -d mydb
psql (12.2, serveur 12.5 . . .
. . .
mydb=> \i C:\my\path\myscript.sql
C:: Permission denied

Il a donc fallu corriger cela lors de l'exécution depuis Python 3.8.6. Je ne voulais pas recourir à un remplacement naïf de chaîne et ai utilisé une fonction existante :

script_path = Path(script_dir).resolve()
input_sql = f'\\i {script_path.joinpath("myscript.sql").as_posix()}\n'

Mais sous le capot, il y a :

# ...\Programs\Python\Python38\Lib\pathlib.py
    def as_posix(self):
        """Retourne la représentation de chaîne du chemin avec des slashes (/) vers l'avant."""
        f = self._flavour
        return str(self).replace(f.sep, '/')

0voto

Guimoute Points 173

La façon dont je le fais est assez simple: rstrip tous les chemins de leurs barres obliques, peu importe leur quantité et leur correction, puis ajoutez et joignez ces chemins en utilisant le séparateur correct.

import os

def join_path_regardless_of_separators(*paths):
    return os.path.sep.join(path.rstrip(r"\/") for path in paths)

a = 'c:/'
b = 'myFirstDirectory/'
c = 'mySecondDirectory'
d = 'myThirdDirectory\\\\\\/'
e = 'myExecutable.exe'
join_path_regardless_of_separators(a, b, c, d, e)
>>> 'c:\\myFirstDirectory\\mySecondDirectory\\myThirdDirectory\\myExecutable.exe'

Une autre façon de l'utiliser, pour le même résultat:

join_path_regardless_of_separators(*"""c:////\\\\
                                       myFirstDirectory/
                                       mySecondDirectory\\\\
                                       myThirdDirectory/////
                                       myExecutable.exe
                                    """.split())

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