Aufbau des absoluten Pfades mit os.path.join ()

Ich möchte einen absoluten Pfad in der Pythonatur aufbauen, während ich zugleich ziemlich gut von Dingen wie Pfad-Trennzeichen bleibe.

Edit0: Zum Beispiel gibt es ein Verzeichnis auf der Wurzel meines Dateisystems /etc/init.d (oder C:\etc\init.d auf w32), und ich möchte das nur aus den Elementen etc und init.d ( Auf w32 brauche ich wohl auch eine disk-ID wie C: 🙂

Um sich nicht um os.join.path() zu sorgen, ist os.join.path() offensichtlich das Werkzeug der Wahl. Aber es scheint, dass dies nur immer relative Pfade schaffen wird:

  print "MYPATH:", os.path.join('etc', 'init.d') MYPATH: etc/init.d 

Das Hinzufügen eines Dummy-First-Elements (zB '' ) hilft nichts:

  print "MYPATH:", os.path.join('', 'etc', 'init.d') MYPATH: etc/init.d 

Machen das erste Element absolut offensichtlich hilft, aber diese Art von Niederlagen die Idee der Verwendung von os.path.join()

  print "MYPATH:", os.path.join('/etc', 'init.d') MYPATH: /etc/init.d 

Edit1: using os.path.abspath() wird nur versuchen, einen relativen Pfad in einen absoluten Pfad zu konvertieren. ZB betrachte folgendes im Arbeitsverzeichnis /home/foo :

  print "MYPATH:", os.path.abspath(os.path.join('etc', 'init.d')) MYPATH: /home/foo/etc/init.d 

Also, was ist die Standard-Cross-Plattform-Weg zu "Wurzel" einen Pfad?

  root = ??? # <-- print "MYPATH:", os.path.join(root, 'etc', 'init.d') MYPATH: /etc/init.d 

Edit2: die frage klappt wirklich auf: da der nachlaufende /etc/init.d in /etc/init.d diesen Pfad zu einem absoluten Pfad macht, gibt es eine Möglichkeit, diesen nachlaufenden Schrägstrich programmatisch zu konstruieren? (Ich möchte keine Annahmen machen, dass ein nachlaufender Schrägstrich einen absoluten Pfad anzeigt)

5 Solutions collect form web for “Aufbau des absoluten Pfades mit os.path.join ()”

Mit os.sep als root arbeitete für mich:

 path.join(os.sep, 'python', 'bin') 

Linux: /python/bin

Windows: \python\bin

Das Hinzufügen von path.abspath() zum mix gibt dir auch Laufwerksbuchstaben auf Windows und ist immer noch kompatibel mit Linux:

 path.abspath(path.join(os.sep, 'python', 'bin')) 

Linux: /python/bin

Windows: C:\python\bin

So dass die Lösung, die ich kam, ist, um die Wurzel des Dateisystems zu konstruieren, indem Sie eine gegebene Datei auf ihre Wurzel:

 def getRoot(file=None): if file is None: file='.' me=os.path.abspath(file) drive,path=os.path.splitdrive(me) while 1: path,folder=os.path.split(path) if not folder: break return drive+path os.path.join(getRoot(), 'etc', 'init.d') 

So können Sie einen Scheck für das Ausführen von os durch sys.platfrom tun

Auf fenster

 >>> sys.platform 'win32' 

Auf linux

 >>> sys.platform 'linux2' 

dann

 if sys.platform == 'win32': ROOT = os.path.splitdrive(os.path.abspath('.'))[0] elif sys.platform == 'linux2': ROOT = os.sep 

Bitte beachten Sie, dass 'linux2' nicht alle linux distros abdecken kann

Ich denke, du kannst os.path.normpath benutzen. Hier ist was ich bei Windows bekomme:

 >>> os.path.normpath("/etc/init.d") '\\etc\\init.d' 

Ich bin mir nicht sicher genau das, was das Richtige mit dem Drive-Präfix zu tun hat, aber ich denke, dass es aussieht, bedeutet so etwas wie "halten Sie mit dem Laufwerk, den ich jetzt bin", was wohl das ist, was Sie wollen. Vielleicht kann jemand, der mit Windows vertraut ist, klären können?

Sie könnten versuchen, mit os.path.splitdrive , um den Namen Ihres Laufwerks / Dateisystems zu erhalten, dann verbinden Sie diese mit Ihrem foo String.

http://docs.python.org/2/library/os.path.html#os.path.splitdrive

So etwas wie (ungetestet!)

 (drive, tail) = os.path.splitdrive(os.getcwd()) os.path.join(drive, 'foo') 

Sollte den Trick machen

  • Wie kann ich den Pfad der Skript der Python laufen?
  • Django: Was soll `sys.path` sein?
  • Python: Gemeinsamen Code unter einer Familie von Skripten teilen
  • Mit Cython-Erweiterung einmal kompiliert [unter Windows], wie man .pyd's verwenden?
  • Spalten von Pfadfolgen in Laufwerk, Pfad und Dateinamen Teile
  • Django import error - Kein Modul namens core.management
  • Importfehler: Kein Modul namens django
  • Subprocess.Popen mit relativen Pfaden
  • Zugriff auf den relativen Pfad in Python
  • Wie konvertiere ich ~ /. Weg zum absoluten Weg
  • Python - Auflisten von Dateien in Ordnern - Pfadnamen mit einer Variablen
  • Python ist die beste Programmiersprache der Welt.