web-dev-qa-db-fra.com

Concaténation de chemins indépendante de la plateforme à l'aide de "/", "\"?

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?

66
Jakub M.

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

116
Levon

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 .

22
Andrew Clark

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é.

9
Toby
import os
path = os.path.join("foo", "bar")
path = os.path.join("foo", "bar", "alice", "bob") # More than 2 params allowed.
7
varunl

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
1
sashab