Comment utiliser «/» (séparateur de répertoire) sous Linux et Windows en Python?

191

J'ai écrit un code en python qui utilise / pour créer un fichier particulier dans un dossier, si je veux utiliser le code dans Windows cela ne fonctionnera pas, y a-t-il un moyen par lequel je peux utiliser le code sous Windows et Linux.

En python, j'utilise ce code:

pathfile=os.path.dirname(templateFile)
rootTree.write(''+pathfile+'/output/log.txt')

Quand j'utiliserai mon code en supposant que Windows machine, mon code ne fonctionnera pas.

Comment utiliser "/" (séparateur de répertoire) sous Linux et Windows?

hulk007
la source
1
Vous pouvez le définir au début en fonction de Win / * nix puis travailler avec la variable.
fedorqui 'SO arrêtez de nuire' le
12
Sous Windows, vous pouvez utiliser \ ou / comme séparateur de répertoire.
SecurityMatt
12
Windows prend /en charge les chemins de répertoire. Quel problème spécifique rencontrez-vous? Publiez du code qui illustre le problème.
Michael Geary
À moins que vous ne dépendiez des programmes de l'espace utilisateur Windows, la barre oblique fonctionne aussi bien que l'arrière. Certaines commandes cmd ont cependant des problèmes avec cela.
Pihhan
1
@Mehrdad: Connaissez-vous un exemple pour lequel l'API Win32 n'accepte pas '/'? (sans compter cmd.exe et autres programmes)
Eryk Sun

Réponses:

268

Utilisez os.path.join(). Exemple: os.path.join(pathfile,"output","log.txt").

Dans votre code, ce serait: rootTree.write(os.path.join(pathfile,"output","log.txt"))

Serban Razvan
la source
9
os.path.joinutilise une logique plus complexe pour faire correspondre plusieurs composants de chemin relatif ensemble. Lorsque vous voulez simplement les enchaîner, os.sep.joinc'est le bon choix.
Bachsau
108

Utilisation:

import os
print os.sep

pour voir à quoi ressemble le séparateur sur un système d'exploitation actuel.
Dans votre code, vous pouvez utiliser:

import os
path = os.path.join('folder_name', 'file_name')
Alexander Kononenko
la source
62

Vous pouvez utiliser os.sep :

>>> import os
>>> os.sep
'/'
Adem Öztaş
la source
39

os.path.normpath(pathname)doit également être mentionné car il convertit les /séparateurs de chemin en \séparateurs sous Windows. Il s'effondre également des références cossues redondantes ... à savoir, A/Bet A/foo/../Bet A/./Bdeviennent tous A/B. Et si vous êtes Windows, tout cela devient A\B.

Jon Rosen
la source
3
C'est l'OMI la meilleure réponse à la question telle qu'elle a été formulée, "comment utiliser" / "(séparateur de répertoire) à la fois sous Linux et Windows". Et c'est aussi éminemment utile - je préfère de loin le faire os.path.normpath('a/b/c/d/file.ext')que os.path.join('a','b','c','d','file.ext')lorsque j'ai besoin de spécifier un long chemin.
ukrutt
J'ai également trouvé cette réponse très utile. Je cherchais une méthode pour générer des chemins avec un séparateur cohérent. Le célèbre os.path.joinrejoint tout ce qui est fourni. par exemple join("a/b", "c\d")donne a/b\c\d(sur windows). Mais je peux obtenir le résultat attendu avec la bonne combinaison de joinet normpath, par exemple a\b\c\d(sur Windows)
Sumudu
17

Si vous avez la chance d'exécuter Python 3.4+, vous pouvez utiliser pathlib:

from pathlib import Path

path = Path(dir, subdir, filename)  # returns a path of the system's path flavour

ou équivalent,

path = Path(dir) / subdir / filename
Eugène Yarmash
la source
16

Quelques liens utiles qui vous aideront:

Maroun
la source
2
pathsep? Généralement utile, mais pas ici, l'OMI.
glglgl
2
@glglgl En effet. J'ai cherché sepmais je n'ai pas pu me résister à poster ceci aussi (j'ai supposé que l'OP le trouverait utile pour les travaux futurs) :)
Maroun
11

Faites un import ospuis utilisezos.sep

JackPoint
la source
8

Vous pouvez utiliser " os.sep "

 import os
 pathfile=os.path.dirname(templateFile)
 directory = str(pathfile)+os.sep+'output'+os.sep+'log.txt'
 rootTree.write(directory)
P113305A009D8M
la source
4

Ne construisez pas vous-même les noms de répertoires et de fichiers, utilisez les bibliothèques incluses de python.

Dans ce cas, celui qui convient est os.path . Surtout join qui crée un nouveau chemin à partir d'un répertoire et un nom de fichier ou un répertoire et split qui obtient le nom de fichier à partir d'un chemin complet.

Votre exemple serait

pathfile=os.path.dirname(templateFile)
p = os.path.join(pathfile, 'output')
p = os.path.join( p, 'log.txt')
rootTree.write(p)
mmmmmm
la source