Manipulando caminhos de diretório em Python
-
26-09-2019 - |
Pergunta
Basicamente, eu tenho esse URL atual e essa outra chave que quero fundir em um novo URL, mas existem três casos diferentes.
Suponha que o URL atual seja localhost: 32401/a/b/foo
Se a chave for bar, então eu quero devolver localhost: 32401/a/b/bar
Se a chave começar com uma barra e é/a/bar, então eu quero devolver localhost: 32401/a/bar
Finalmente, se Key é seu próprio URL independente, então eu só quero devolver essa chave = http://foo.com/bar -> http://foo.com/bar
Suponho que exista uma maneira de fazer pelo menos os dois primeiros casos sem manipular as cordas manualmente, mas nada saltou para mim imediatamente no módulo OS.Path.
Solução
Suponho que exista uma maneira de fazer pelo menos os dois primeiros casos sem manipular as cordas manualmente, mas nada saltou para mim imediatamente no módulo OS.Path.
Isso porque você quer usar urllib.parse
(para Python 3.x) ou urlparse
(para Python 2.x) em vez disso.
Não tenho muita experiência com isso, então aqui está um trecho usando str.split()
e str.join()
.
urlparts = url.split('/')
if key.startswith('http://'):
return key
elif key.startswith('/'):
return '/'.join(urlparts[:2], key[1:])
else:
urlparts[len(urlparts) - 1] = key
return '/'.join(urlparts)
Outras dicas
Você verificou o urlparse módulo?
Dos documentos,
from urlparse import urljoin
urljoin('http://www.cwi.nl/%7Eguido/Python.html', 'FAQ.html')
Deve ajudar com seu primeiro caso.
Obviamente, você sempre pode fazer manipulação básica de string para o resto.
Os objetos de string no Python têm todos os métodos iniciantes e finais que devem poder chegar lá. Algo assim talvez?
def merge(current, key):
if key.startswith('http'):
return key
if key.startswith('/'):
parts = current.partition('/')
return '/'.join(parts[0], key)
parts = current.rpartition('/')
return '/'.join(parts[0], key)