Python - os.path
Como funcionam as funções basename(), dirname() e os.path.abspath() do módulo os.path.
Neste artigo teremos um peque vislumbre do módulo os.path e suas principais função como
basename(),dirname()eos.path.abspath()
Veremos também as combinações…
os.path.abspath(os.path.dirname(""))os.path.dirname(os.path.abspath(""))
os.path.basename()
Se aplicarmos a função split na URL ("path/path".split("/")), teremos uma lista como resposta parecida com esta
['path', 'path']. Em outras palavras, a função basename() separa a URL em uma lista e retorna o último elemento,
veja:
url.split("/")[-1]
Exemplo, a URL é separada em lista…
"project/foo.py".split("/")
# ['project', 'foo.py']
Retorna-se o último elemento ([-1]) da lista…
"project/foo.py".split("/")[-1]
# 'foo.py'
Eis a definição na documentação “Return the base name of pathname path. This is the second element of the pair returned
by passing path to the function split()”.
Dá a impressão que ele pega sempre o último elemento, veja mais exemplos.
os.path.basename("")
# ''
os.path.basename("path")
# 'path'
os.path.basename("path/")
# ''
os.path.basename("path/to")
# 'to'
os.path.basename("path/to/")
# ''
os.path.basename("path/to/project")
# 'project'
os.path.basename("path/to/project/")
# ''
os.path.basename("path/to/project/foo.py")
# 'foo.py'
os.path.basename()
# TypeError: basename() takes exactly 1 argument (0 given)
os.path.dirname()
A função dirname() separa a URL e retorna o “range” que vai do primeiro item até o penúltimo ([:-1]).
url.split("/")[:-1]
O resultado do trecho acima ainda seria uma lista e, no caso, será convertido para string. Mas é obvio que a função faz muito mais que isso.
Exemplo, a URL é separada em lista…
"project/foo.py".split("/")
# ['project', 'foo.py']
Retorna-se o range do primeiro até o penúltimo elemento ([-1]) da lista…
"project/foo.py".split("/")[:-1]
# ['project']
Eis a definição na documentação “Return the directory name of pathname path. This is the first element of the pair
returned by passing path to the function split()”.
Veja mais exemplos.
os.path.dirname("")
# ''
os.path.dirname("path")
# ''
os.path.dirname("path/")
# 'path'
os.path.dirname("path/to")
# 'path'
os.path.dirname("path/to/")
# 'path/to'
os.path.dirname("path/to/project")
# 'path/to'
os.path.dirname("path/to/project/")
# 'path/to/project'
os.path.dirname("path/to/project/foo.py")
# 'path/to/project'
os.path.dirname()
# TypeError: dirname() takes exactly 1 argument (0 given)
os.path.abspath()
É um “join()” entre o local de execução do script e a URL passada como parâmetro.
Supondo o funcionamento…
abs = os.getcwd() = "/var/www"
path = "project/index"
return abs + path
Só que path recebe um tratamento que, diga-se de passagem, difere tanto de dirname como de basename. Talvez
seja o efeito da função normpath(), como comentado na documentação.
Para ter uma idéia, é como se ele a URL fosse separada em uma lista e retornado todos os elementos desde que não seja
"" (string de cumprimento zero). Exemplo:
"path/".split("/") --> ['path', ''] --> "path"
"path/to".split("/") --> ['path', 'to'] --> "path/to"
"path/to/".split("/") --> ['path', 'to', ''] --> "path/to"
Eis a definição na documentação “Return a normalized absolutized version of the pathname path. On most platforms, this
is equivalent to calling the function normpath() as follows: normpath(join(os.getcwd(), path))”.
Veja mais exemplo e repare no acréscimo do pasta home/.
os.path.abspath("")
# '/home'
os.path.abspath("path")
# '/home/path'
os.path.abspath("path/")
# '/home/path'
os.path.abspath("path/to")
# '/home/path/to'
os.path.abspath("path/to/")
# '/home/path/to'
os.path.abspath("path/to/project")
# '/home/path/to/project'
os.path.abspath("path/to/project/")
# '/home/path/to/project'
os.path.abspath("path/to/project/foo.py")
# '/home/path/to/project/foo.py'
os.path.abspath()
# TypeError: abspath() takes exactly 1 argument (0 given)
os.path.abspath(os.path.dirname(“”))
Sabemos que abspath é um “join” do caminho absoluto com o caminho (path) passado como parâmetro. Sabemos também que dirname retornará somente a pasta (sem o arquivo).
Estou executando os comandos abaixo na raiz da pasta home, ou seja cd /home.
os.path.abspath(os.path.dirname(""))
# '/home'
os.path.abspath(os.path.dirname("path"))
# '/home'
os.path.abspath(os.path.dirname("path/"))
# '/home/path'
os.path.abspath(os.path.dirname("path/to"))
# '/home/path'
os.path.abspath(os.path.dirname("path/to/"))
# '/home/path/to'
os.path.abspath(os.path.dirname("path/to/project"))
# '/home/path/to'
os.path.abspath(os.path.dirname("path/to/project/"))
# '/home/path/to/project'
os.path.abspath(os.path.dirname("path/to/project/foo.py"))
# '/home/path/to/project'
os.path.dirname(os.path.abspath(“”))
O comando acima é o inverso do anterior, se você já sabe o funcionamento de cada um deles não será difícil deduzir o resultado da operação.
Estou executando os comandos abaixo na raiz da pasta home, ou seja cd /home.
os.path.dirname(os.path.abspath(""))
# '/'
os.path.dirname(os.path.abspath("path"))
# '/home'
os.path.dirname(os.path.abspath("path/"))
# '/home'
os.path.dirname(os.path.abspath("path/to"))
# '/home/path'
os.path.dirname(os.path.abspath("path/to/"))
# '/home/path'
os.path.dirname(os.path.abspath("path/to/project"))
# '/home/path/to'
os.path.dirname(os.path.abspath("path/to/project/"))
# '/home/path/to'
os.path.dirname(os.path.abspath("path/to/project/foo.py"))
# '/home/path/to/project'