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?


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"))


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')


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.


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

16

Quelques liens utiles qui vous aideront:


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


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)

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)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.