Zum Beispiel möchte ich Ressourcenpfaden wie /js/foo.js einen Präfixpfad hinzufügen.
Ich möchte, dass der resultierende Pfad relativ zum Stammverzeichnis des Servers ist. Wenn das Präfix im obigen Beispiel "media" wäre, möchte ich, dass das Ergebnis /media/js/foo.js ist.
os.path.join macht das wirklich gut, aber wie es Pfade verbindet, hängt vom Betriebssystem ab. In diesem Fall weiß ich, dass ich auf das Web abziele, nicht auf das lokale Dateisystem.
Gibt es eine beste Alternative, wenn Sie mit Pfaden arbeiten, von denen Sie wissen, dass sie in URLs verwendet werden? Funktioniert os.path.join gut genug? Soll ich nur meine eigenen rollen?
os.path.join
wird nicht funktionieren. Das einfache Verbinden durch das/
Zeichen sollte jedoch in allen Fällen funktionieren -/
ist das Standardpfadtrennzeichen in HTTP gemäß der Spezifikation.Antworten:
Da aus den Kommentaren des OP hervorgeht, dass er anscheinend keine "absoluten URLs" im Join beibehalten möchte (was eine der Schlüsselaufgaben von
urlparse.urljoin
;-) ist, würde ich empfehlen, dies zu vermeiden.os.path.join
wäre auch schlecht, aus genau dem gleichen Grund.Also würde ich so etwas verwenden
'/'.join(s.strip('/') for s in pieces)
(wenn die Führung/
auch ignoriert werden muss - wenn die Hauptrolle in einem speziellen Gehäuse sein muss, ist das natürlich auch machbar ;-).quelle
os.path.join('http://media.com', 'content')
Wourd zurückkehrthttp://media.com\content
.Sie können verwenden
urllib.parse.urljoin
:Aber Vorsicht :
Der Grund , warum Sie erhalten unterschiedliche Ergebnisse aus
/js/foo.js
undjs/foo.js
ist , da erstere mit einem Schrägstrich beginnt , das bedeutet , dass es beginnt bereits auf der Website root.Auf Python 2 müssen Sie tun
quelle
urljoin
jemals '/' entfernt. Wenn ich es miturlparse.urljoin('/media/', '/js/foo.js')
dem zurückgegebenen Wert aufrufe, ist es '/js/foo.js'. Es wurden alle Medien entfernt, nicht das Duplikat '/'. Tatsächlich wirdurlparse.urljoin('/media//', 'js/foo.js')
"/media//js/foo.js" zurückgegeben, sodass keine Duplikate entfernt werden.urljoin
nicht zum Beitreten von URLs. Es dient zum Auflösen relativer URLs, wie sie in HTML-Dokumenten usw. zu finden sindWie Sie sagen,
os.path.join
verbindet Pfade basierend auf dem aktuellen Betriebssystem.posixpath
ist das zugrunde liegende Modul, das auf Posix-Systemen unter dem Namespace verwendet wirdos.path
:Sie können also einfach
posixpath.join
URLs importieren und verwenden , die verfügbar sind und auf jeder Plattform funktionieren .Bearbeiten: @ Petes Vorschlag ist gut, Sie können den Import für eine bessere Lesbarkeit aliasen
Bearbeiten: Ich denke, dies wird klarer gemacht oder hat mir zumindest geholfen zu verstehen, wenn Sie sich die Quelle von ansehen
os.py
(der Code hier stammt aus Python 2.7.11, und ich habe einige Bits gekürzt). Es gibt bedingte Importeos.py
, die auswählen, welches Pfadmodul im Namespace verwendet werden sollos.path
. Alle die zugrunde liegende Module (posixpath
,ntpath
,os2emxpath
,riscospath
) , die in eingeführt werden kannos.py
, der Aliaspath
gibt es und existiert auf allen Systemen verwendet werden.os.py
wählt nur eines der Module aus, dieos.path
zur Laufzeit im Namespace verwendet werden sollen, basierend auf dem aktuellen Betriebssystem.quelle
from posixpath import join as urljoin
schön alias es zu etwas leicht zu lesen.Das macht den Job gut:
quelle
Die basejoin- Funktion im urllib- Paket könnte genau das sein, wonach Sie suchen.
Bearbeiten: Ich habe es vorher nicht bemerkt, aber urllib.basejoin scheint direkt auf urlparse.urljoin abzubilden, was letzteres bevorzugt.
quelle
Mit furl wird
pip install furl
es sein:quelle
.url
am Ende hinzufügen :furl.furl('/media/path/').add(path='js/foo.js').url
furl('/media/path/').add(path=furl('/js/foo.js').path).url
weilfurl('/media/path/').add(path='/js/foo.js').url
ist/media/path//js/foo.js
Ich weiß, dass dies etwas mehr ist, als das OP verlangt hat. Ich hatte jedoch die Teile unter der folgenden URL und suchte nach einer einfachen Möglichkeit, sie zu verbinden:
Schauen Sie sich um:
Zusätzlich zu dem Pfad, der bereits in den anderen Antworten beantwortet wurde, habe ich Folgendes getan , um das zu erhalten, wonach ich gesucht habe:
Laut Dokumentation dauert es genau ein 5-teiliges Tupel.
Mit folgendem Tupelformat:
quelle
Rune Kaagaard bot eine großartige und kompakte Lösung, die für mich funktionierte. Ich habe sie ein wenig erweitert:
Auf diese Weise können alle Argumente unabhängig von abschließenden und endenden Schrägstrichen verknüpft werden, wobei der letzte Schrägstrich beibehalten wird, falls vorhanden.
quelle
return "/".join([str(x).strip("/") for x in args]) + trailing_slash
Um die Reaktion von Alex Martelli etwas zu verbessern, werden im Folgenden nicht nur zusätzliche Schrägstriche bereinigt, sondern auch nachfolgende (End-) Schrägstriche beibehalten, was manchmal nützlich sein kann:
Es ist jedoch nicht so einfach zu lesen und bereinigt nicht mehrere zusätzliche nachgestellte Schrägstriche.
quelle
Ich fand Dinge, die mir an all den oben genannten Lösungen nicht gefallen, und fand meine eigenen. Diese Version stellt sicher, dass Teile mit einem einzigen Schrägstrich verbunden werden und führende und nachfolgende Schrägstriche allein bleiben. Nein
pip install
, keineurllib.parse.urljoin
Verrücktheit.quelle
Mit Furl und Regex (Python 3)
quelle