J'ai essayé d'utiliser os.normpath
afin de convertir http://example.com/a/b/c/../
en http://example.com/a/b/
mais cela ne fonctionne pas sur Windows car il convertit le slash en backslash.Comment est-ce que je peux normaliser/réduire des chemins ou des URLs en Python indépendamment de l'OS?
Répondre
Voici comment faire
>>> import urlparse
>>> urlparse.urljoin("ftp://domain.com/a/b/c/d/", "../..")
'ftp://domain.com/a/b/'
>>> urlparse.urljoin("ftp://domain.com/a/b/c/d/e.txt", "../..")
'ftp://domain.com/a/b/'
Rappelez-vous que urljoin
considèrent comme un chemin/répertoire tous jusqu'au dernier /
- après le nom du fichier, le cas échéant.
De même, n'ajoutez pas de /
au second paramètre, sinon vous n'obtiendrez pas le résultat attendu.
os.path
Le module est dépendant de la plate-forme, mais pour les chemins de fichier utilisant uniquement des barres obliques mais pas des URL, vous pouvez utiliser posixpath,normpath
.
adopté à partir du module os "- os.path est l'un des modules posixpath, ou ntpath", dans votre cas, en utilisant explicitement posixpath.
>>> import posixpath
>>> posixpath.normpath("https://stackoverflow.com/a/b/../c")
'/a/c'
>>>
'posixpath.normpath' fait des choses inutiles comme la suppression des barres obliques et la double barre oblique initiale. Remplace également le chemin vide par '.'. –
Ni urljoin
ni posixpath.normpath
faire le travail correctement. urljoin
vous oblige à joindre quelque chose, et ne gère pas les chemins absolus ou ..
s correctement. posixpath.normpath
regroupe plusieurs barres obliques et supprime les barres obliques de fin, deux éléments que les URL ne doivent pas faire.
La fonction suivante résout complètement les URL, la manipulation et les deux .
s ..
s, d'une manière correcte en fonction de RFC 3986.
try:
# Python 3
from urllib.parse import urlsplit, urlunsplit
except ImportError:
# Python 2
from urlparse import urlsplit, urlunsplit
def resolve_url(url):
parts = list(urlsplit(url))
segments = parts[2].split('/')
segments = [segment + '/' for segment in segments[:-1]] + [segments[-1]]
resolved = []
for segment in segments:
if segment in ('../', '..'):
if resolved[1:]:
resolved.pop()
elif segment not in ('./', '.'):
resolved.append(segment)
parts[2] = ''.join(resolved)
return urlunsplit(parts)
Vous pouvez ensuite l'appeler sur une URL complète comme suit.
>>> resolve_url("http://example.com/dir/../../thing/.")
'http://example.com/thing/'
Pour plus d'informations sur les considérations qui doivent être prises lors de la résolution des URL, voir a similar answer I wrote earlier on the subject.
- 1. Comment est-ce que je peux réduire une exécution de git bisect en utilisant des chemins de fichier?
- 2. Comment est-ce que je peux patcher des assemblys .NET?
- 3. Python Regular Expression pour ajouter des liens vers des urls
- 4. Comment parcourir les threads Python indépendamment? (WinPDB)
- 5. Comment écrire des URLs en Latex?
- 6. Comment charger des vues indépendamment du site.master?
- 7. Comment est-ce que je peux faire des présentations PowerPoint/charger automatiquement des ppts?
- 8. url réécriture - construire des chemins
- 9. Comment convertir un flottant en chaîne indépendamment des paramètres régionaux?
- 10. Comment convertir `git:` urls en `http:` urls
- 11. Comment est-ce que je peux sérialiser ce JSON en utilisant des annotations de Jackson?
- 12. joindre des URLs relatifs?
- 13. Comment puis-je m'assurer que le module de recherche de Ruby retournera toujours des chemins absolus?
- 14. Liste des urls OpenID
- 15. Comment est-ce que je peux faire défiler des événements de mouseover de déclenchement de page?
- 16. Calcul des chemins SVG
- 17. Python: Créé le dictionnaire imbriqué de la liste des chemins
- 18. comment générer des URLs conviviales dans Joomla?
- 19. Comment autodétecter des URLs dans RichEdit 2.0?
- 20. Comment est-ce que je peux rendre automatiquement des partiels en utilisant markdown dans Rails 3?
- 21. Comment séparer des noms de fichiers de chemins en utilisant python?
- 22. Comment est-ce que je peux traduire des concepts de tronc/branche de Subversion à Git?
- 23. Comment est-ce que je peux représenter la vidéo AVI comme ensemble de matrices using Python?
- 24. Comment est-ce que je peux citer ou grouper automatiquement des arguments de ligne de commande pour l'alias dans bash?
- 25. IIS 6: Activation des chemins virtuels
- 26. Comment est-ce que je peux afficher des bordures pour des géométries avec UMN-Mapserver seulement en zoomant beaucoup?
- 27. Comment puis-je implémenter un OutputStream que je peux rembobiner?
- 28. comment importer des contacts de différents services tels que Gmail ou Yahoo en utilisant python/django
- 29. Convertir des chemins courts (8.3) en longs?
- 30. Python - Possibilité de lever des exceptions indépendamment de try/except block?
Au contraire: Si le second paramètre a un préfixe '/', il retournera 'ftp: //domain.com /../ ..'. Corriger –