Intenté usar os.normpath
para convertir http://example.com/a/b/c/../
en , pero no funciona en Windows porque convierte la barra oblicua en barra diagonal inversa.¿Cómo puedo normalizar/colapsar rutas o URL en Python en modo independiente del sistema operativo?
¿Cómo puedo normalizar/colapsar rutas o URL en Python en modo independiente del sistema operativo?
Respuesta
Aquí es cómo hacerlo
>>> 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/'
Recuerde que urljoin
consideran un camino/directorio de todo hasta el último /
- después de esto es el nombre del archivo, si la hay.
Además, no agregue un /
al segundo parámetro, de lo contrario no obtendrá el resultado esperado.
os.path
módulo depende de la plataforma, pero para rutas de archivos que utilizan solo barras, pero no URL, puede usar posixpath,normpath
.
adoptado del módulo os "- os.path es uno de los módulos posixpath, o ntpath", en su caso que usa explícitamente posixpath.
>>> import posixpath
>>> posixpath.normpath("https://stackoverflow.com/a/b/../c")
'/a/c'
>>>
'posixpath.normpath' hace cosas inútiles como eliminar barras diagonales y permitir doble barra inicial. También reemplaza la ruta vacía con '.'. –
Ni urljoin
ni posixpath.normpath
hacer el trabajo correctamente. urljoin
lo obliga a unirse a algo, y no maneja rutas absolutas o excesivas ..
s correctamente. posixpath.normpath
colapsa varias barras diagonales y elimina las barras diagonales, ambas son cosas que las URL no deberían hacer.
La siguiente función resuelve URLs completamente, el manejo tanto de .
s y ..
s, de una forma correcta de acuerdo con 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)
A continuación, puede llamarlo en una URL completa de la siguiente manera.
>>> resolve_url("http://example.com/dir/../../thing/.")
'http://example.com/thing/'
Para obtener más información acerca de las consideraciones que se tienen que hacer en la resolución de direcciones URL, consulte a similar answer I wrote earlier on the subject.
- 1. Portapapeles independiente del sistema operativo copiar/pegar texto en C
- 2. C biblioteca de sistema operativo independiente
- 3. Cómo generar una ruta independiente de sistema operativo en C++
- 4. Python: sistema operativo Lista independiente de dispositivos de almacenamiento disponibles
- 5. ¿Cómo puedo encontrar el sistema operativo actual en Python?
- 6. ¿Cómo detectar el idioma predeterminado del sistema operativo en python?
- 7. ¿Cómo puedo cambiar las unidades usando el sistema operativo python?
- 8. ¿Cómo puedo devolver la información del sistema en Python?
- 9. API independiente del sistema operativo para supervisar el sistema de archivos?
- 10. ¿Cómo puedo reemplazar el calendario predeterminado del sistema operativo Android?
- 11. ¿Cómo comprobar si el sistema operativo es Vista en Python?
- 12. ¿Cómo puedo construir rutas de archivos independientes del sistema operativo en Perl, incluida una letra de unidad de Windows opcional?
- 13. ¿Cómo puedo detectar el sistema operativo en Perl?
- 14. Cómo determinar el sistema operativo en elisp?
- 15. ¿Cómo cargo las variables del sistema operativo en PL/SQL?
- 16. ¿Cómo detectar la codificación del sistema operativo en php?
- 17. ¿Cómo se implementa sleep en el nivel del sistema operativo?
- 18. Tiempo de compilación del sistema operativo
- 19. ¿Cómo habilita mod_rewrite en cualquier sistema operativo?
- 20. Detectar sistema operativo en Clojure
- 21. ¿Cómo se lee 'List separator' del sistema operativo en Java?
- 22. ¿Cómo detectar el sistema operativo en ejecución?
- 23. ¿Cómo imprimo en la impresora predeterminada del sistema operativo en Python 3 (plataforma cruzada)?
- 24. Requisitos del sistema operativo para arc4random_uniform()
- 25. ¿Cómo funciona exactamente el núcleo de protección del sistema operativo
- 26. ¿Dónde puedo encontrar la primera versión del sistema operativo Linux?
- 27. Pregunta de arranque del sistema operativo básico
- 28. hay una JVM independiente que se ejecuta en una PC sin ningún sistema operativo
- 29. ¿Cómo puedo determinar el sistema operativo del sistema desde un script Lua?
- 30. Cómo determinar el sistema operativo
Por el contrario: si el segundo parámetro tiene un '/', devolverá 'ftp: //domain.com /../ ..'. De corrección. –