2012-06-06 10 views
36

In Python habe ich die Variablen base_dir und filename. Ich möchte sie verketten, um fullpath zu erhalten. Aber unter Windows sollte ich \ und für POSIX / verwenden.verketten Pfad - Plattform unabhängig - "/", ""

fullpath = "%s/%s" % (base_dir, filename) # for Linux 

Wie macht man es plattformunabhängig?

Doppelte: Platform-independent file paths?

+0

mögliches Duplikat von [Plattformunabhängige Dateipfade?] (Http://stackoverflow.com/questions/6036129/platform-independent-file-paths) –

Antwort

72

Sie wollen os.path.join() für diesen Einsatz.

Die Stärke der Verwendung dieser anstelle von String-Verkettungen usw. besteht darin, dass sie sich der verschiedenen OS-spezifischen Probleme, wie Pfadtrennzeichen, bewusst sind. Beispiele:

import os 

Unter Windows 7:

base_dir = r'c:\bla\bing' 
filename = r'data.txt' 

os.path.join(base_dir, filename) 
'c:\\bla\\bing\\data.txt' 

Unter Linux:

base_dir = '/bla/bing' 
filename = 'data.txt' 

os.path.join(base_dir, filename) 
'/bla/bing/data.txt' 

Das os Modul enthält viele nützliche Methoden für die Verzeichnis, Pfad Manipulation und herauszufinden, OS bestimmte Informationen, z. B. das Trennzeichen, das in Pfaden überverwendet wird

+3

Windows akzeptiert jedoch auch Schrägstriche. – multigoodverse

17

Verwendung os.path.join():

import os 
fullpath = os.path.join(base_dir, filename) 

Das os.path Modul enthält alle Methoden Sie für plattformunabhängige Weg Manipulation benötigen sollten, aber im Falle müssen Sie wissen, was der Pfadseparator auf der aktuellen Plattform ist, können Sie Verwenden Sie os.sep.

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 

Die Nutzung ist:

a = u("http://some/path") 
    b = a + "and/some/another/path" # http://some/path/and/some/another/path 
+1

es ist nicht * full * path wenn 'base_dir' ein relativer Pfad ist (obwohl OP es benutzt) – jfs

+1

Das Hinzufügen eines' abspath() 'Aufrufs sollte es zu einem vollständigen Pfad machen, wenn etwas relatives darin ist. – martineau

+0

@Andrew Clark, os.sep gibt "\\" unter Windows zurück, aber es funktioniert auch, wenn ich "/" verwende. Gibt es ein Problem, wenn wir nur "/" verwenden? – multigoodverse

3
import os 
path = os.path.join("foo", "bar") 
path = os.path.join("foo", "bar", "alice", "bob") # More than 2 params allowed. 
0

Ich habe eine Hilfsklasse für diese gemacht pathlib operators:

from pathlib import Path 

# evaluates to ./src/cool-code/coolest-code.py on Mac 
concatenated_path = Path("./src")/"cool-code\\coolest-code.py" 

Es ist möglicherweise besser lesbar als os.path.join(), wenn Sie das Glück haben, eine aktuelle Version von Python zu verwenden. Sie können jedoch auch die Kompatibilität mit älteren Versionen von Python in Frage stellen, wenn Sie Ihren Code beispielsweise in einer starren oder älteren Umgebung ausführen müssen.

2

Ausgraben eine alte Frage hier, aber auf Python 3.4+ können Sie verwenden

Verwandte Themen