Dans python j'ai des variables base_dir
et filename
. Je voudrais les concaténer pour obtenir fullpath
. Mais sous Windows, je devrais utiliser \
et pour POSIX /
.
fullpath = "%s/%s" % ( base_dir, filename ) # for Linux
Comment rendre la plate-forme indépendante?
Vous voulez utiliser os.path.join () pour cela.
L’intérêt de l’utilisation de cette concaténation plutôt que de chaînes, c’est qu’elle est consciente des divers problèmes propres au système d’exploitation, tels que les séparateurs de chemins. Exemples:
import os
Sous Windows 7 :
base_dir = r'c:\bla\bing'
filename = r'data.txt'
os.path.join(base_dir, filename)
'c:\\bla\\bing\\data.txt'
Sous Linux :
base_dir = '/bla/bing'
filename = 'data.txt'
os.path.join(base_dir, filename)
'/bla/bing/data.txt'
Le module os contient de nombreuses méthodes utiles pour la manipulation de répertoires et de chemins et la recherche d'informations spécifiques au système d'exploitation, telles que le séparateur utilisé dans les chemins via os.sep
Utilisez os.path.join()
:
import os
fullpath = os.path.join(base_dir, filename)
Le module os.path contient toutes les méthodes dont vous auriez besoin pour manipuler le chemin indépendamment de la plate-forme, mais vous pouvez utiliser le séparateur de chemin sur la plate-forme actuelle. os.sep
.
Déterrer une vieille question ici, mais sur Python 3.4+, vous pouvez utiliser opérateurs de pathlib) :
from pathlib import Path
# evaluates to ./src/cool-code/coolest-code.py on Mac
concatenated_path = Path("./src") / "cool-code\\coolest-code.py"
Il est potentiellement plus lisible que os.path.join()
si vous avez la chance d'exécuter une version récente de Python. Mais vous échangez également la compatibilité avec les anciennes versions de Python si vous devez exécuter votre code dans, par exemple, un environnement rigide ou hérité.
import os
path = os.path.join("foo", "bar")
path = os.path.join("foo", "bar", "alice", "bob") # More than 2 params allowed.
J'ai créé un cours d'aide pour cela:
import os
class u(str):
"""
Class to deal with urls concat.
"""
def __init__(self, url):
self.url = str(url)
def __add__(self, other):
if isinstance(other, u):
return u(os.path.join(self.url, other.url))
else:
return u(os.path.join(self.url, other))
def __unicode__(self):
return self.url
def __repr__(self):
return self.url
L'utilisation est:
a = u("http://some/path")
b = a + "and/some/another/path" # http://some/path/and/some/another/path