Respostas:
>>> import os
>>> os.path.abspath("mydir/myfile.txt")
'C:/example/cwd/mydir/myfile.txt'
Também funciona se já for um caminho absoluto:
>>> import os
>>> os.path.abspath("C:/example/cwd/mydir/myfile.txt")
'C:/example/cwd/mydir/myfile.txt'
normpath()
da seguinte forma: normpath(join(os.getcwd(), path))
. Portanto, se mydir/myfile.txt
não o fizer os.getcwd()
, o caminho absoluto não será o caminho real .
mydir/myfile.txt
refere-se implicitamente a um caminho dentro do diretório de trabalho atual, pois é equivalente a ./mydir/myfile.txt
. Esse pode não ser o caminho que você pretendia inserir, mas parece que a interpretação correta do caminho, até onde eu sei. Você poderia elaborar?
abspath
função e um arquivo real. Você pode fornecer arquivos de nome de caminho inexistentes e as hierarquias de diretório são boas e o abspath simplesmente resolverá os bits do caminho (incluindo o ..
elemento " " do diretório pai ) e retornará uma string. Esta é apenas uma string calculada a partir do diretório atual; qualquer correlação com um arquivo real é acidental, ao que parece. Tente os.path.abspath("/wow/junk/../blha/hooey")
. Funciona.
os.path.exists
. Pelo contrário, sistemas como o PowerShell que insistem no caminho existente com a função de resolução de caminho padrão são uma tarefa difícil de usar.
relpath
path
relpath
Você pode usar a nova biblioteca Python 3.4 pathlib
. (Você também pode obtê-lo para Python 2.6 ou 2.7 usando pip install pathlib
.) Os autores escreveram : "O objetivo desta biblioteca é fornecer uma hierarquia simples de classes para manipular os caminhos do sistema de arquivos e as operações comuns que os usuários fazem sobre eles".
Para obter um caminho absoluto no Windows:
>>> from pathlib import Path
>>> p = Path("pythonw.exe").resolve()
>>> p
WindowsPath('C:/Python27/pythonw.exe')
>>> str(p)
'C:\\Python27\\pythonw.exe'
Ou no UNIX:
>>> from pathlib import Path
>>> p = Path("python3.4").resolve()
>>> p
PosixPath('/opt/python3/bin/python3.4')
>>> str(p)
'/opt/python3/bin/python3.4'
Os documentos estão aqui: https://docs.python.org/3/library/pathlib.html
os.path.abspath()
me deu um erro :, AttributeError: 'NoneType' object has no attribute 'startswith'
using Path().resolve()
does not com o mesmo caminho de arquivo relativo. (Linux e Python3.4)
Melhor ainda, instale o módulo (encontrado em PyPI
), ele agrupa todas as os.path
funções e outras funções relacionadas em métodos em um objeto que pode ser usado onde quer que as strings sejam usadas:
>>> from path import path
>>> path('mydir/myfile.txt').abspath()
'C:\\example\\cwd\\mydir\\myfile.txt'
>>>
pathlib
. Veja minha resposta neste tópico.
from path import Path
seguidaPath('mydir/myfile.txt').abspath()
path
módulo diferente . O módulo vinculado usa uma classe chamada path
.
Hoje você também pode usar o unipath
pacote baseado em path.py
: http://sluggo.scrapping.cc/python/unipath/
>>> from unipath import Path
>>> absolute_path = Path('mydir/myfile.txt').absolute()
Path('C:\\example\\cwd\\mydir\\myfile.txt')
>>> str(absolute_path)
C:\\example\\cwd\\mydir\\myfile.txt
>>>
Eu recomendaria usar este pacote, pois oferece uma interface limpa para os utilitários comuns do os.path .
Atualização para o Python 3.4+ pathlib
que realmente responde à pergunta:
from pathlib import Path
relative = Path("mydir/myfile.txt")
absolute = relative.absolute() # absolute is a Path object
Se você precisar apenas de uma sequência temporária, lembre-se de que pode usar Path
objetos com todas as funções relevantes os.path
, incluindo, é claro abspath
:
from os.path import abspath
absolute = abspath(relative) # absolute is a str object
import os
os.path.abspath(os.path.expanduser(os.path.expandvars(PathNameString)))
Observe que expanduser
é necessário (no Unix), caso a expressão fornecida para o nome e o local do arquivo (ou diretório) possa conter um líder ~/
(o til refere-se ao diretório inicial do usuário) e expandvars
cuida de quaisquer outras variáveis de ambiente (como $HOME
).
Isso sempre obtém o nome do arquivo correto do script atual, mesmo quando é chamado de outro script. É especialmente útil ao usar subprocess
.
import sys,os
filename = sys.argv[0]
a partir daí, você pode obter o caminho completo do script com:
>>> os.path.abspath(filename)
'/foo/bar/script.py'
Também facilita a navegação nas pastas, anexando /..
quantas vezes você quiser subir na hierarquia dos diretórios.
Para obter o cwd:
>>> os.path.abspath(filename+"/..")
'/foo/bar'
Para o caminho pai:
>>> os.path.abspath(filename+"/../..")
'/foo'
Ao combinar "/.."
com outros nomes de arquivos, você pode acessar qualquer arquivo no sistema.
O módulo os
fornece uma maneira de encontrar o caminho do abs.
MAS a maioria dos caminhos no Linux começa com~
(til), o que não fornece um resultado satisfatório.
então você pode usar srblib
para isso.
>>> import os
>>> os.path.abspath('~/hello/world')
'/home/srb/Desktop/~/hello/world'
>>> from srblib import abs_path
>>> abs_path('~/hello/world')
'/home/srb/hello/world'
instale-o usando python3 -m pip install srblib
Eu prefiro usar glob
Aqui está como listar todos os tipos de arquivos na sua pasta atual:
import glob
for x in glob.glob():
print(x)
Aqui está como listar todos os arquivos .txt (por exemplo) na sua pasta atual:
import glob
for x in glob.glob('*.txt'):
print(x)
Aqui está como listar todos os tipos de arquivo em um diretório escolhido:
import glob
for x in glob.glob('C:/example/hi/hello/'):
print(x)
espero que isso tenha ajudado
os.path.abspath()
) para qualquer caminho relativo glob
fornece para seus dois primeiros casos ...
se você estiver em um mac
import os
upload_folder = os.path.abspath("static/img/users")
isso lhe dará um caminho completo:
print(upload_folder)
mostrará o seguinte caminho:
>>>/Users/myUsername/PycharmProjects/OBS/static/img/user