O os.makedirs do Python não entende "~" no meu caminho

159

Eu tenho um pequeno problema com ~ nos meus caminhos.

Este exemplo de código cria alguns diretórios chamados "~ / some_dir" e não entende que eu queria criar some_dir no meu diretório pessoal.

my_dir = "~/some_dir"
if not os.path.exists(my_dir):
    os.makedirs(my_dir)

Observe que isso está em um sistema baseado em Linux.

Johan
fonte

Respostas:

277

Você precisa expandir o til manualmente:

my_dir = os.path.expanduser('~/some_dir')
SilentGhost
fonte
1
Portanto, eu não usei os.path.expanduser, fiz o que o OP fez e o python criou o diretório "~" no meu diretório atual. Como posso excluir esse diretório (sem remover o diretório inicial real)?
Happy Mittal
1
@HappyMittal para os outros que se perguntam, você pode simplesmente usar ./para fazer referência ao seu diretório atual e, assim, ./~remover a pasta ~no diretório atual. Para ser mais seguro, é mais fácil de simplesmente fornecer o caminho completo: rm -rf path/to/bad/dir/~.
alkasm 17/09/19
Ou apenas escape com uma barra invertida:rm \~
DDMC 19/06
71

A conversão de ~/some_dirpara $HOME/some_diré chamada de expansão til e é um recurso comum da interface do usuário. O sistema de arquivos não sabe nada sobre isso.

No Python, esse recurso é implementado pelo os.path.expanduser :

my_dir = os.path.expanduser("~/some_dir")
ddaa
fonte
De fato, e é perfeitamente válido ter um arquivo ou diretório nomeado ~. Portanto, o atalho inicial do shell é ambíguo e evitado, se possível.
bobince
7
Observe que é possível acessar um arquivo / diretório chamado "~" no diretório atual, mesmo quando a expansão til estiver ocorrendo, usando a notação "./~". Isso funciona porque ~ a expansão ocorre apenas no início de um nome de arquivo. Também é um truque conveniente para nomes de arquivos que começam com "-" ou outros caracteres que são tratados especialmente por interfaces de linha de comando. Você poderia dizer que eu provavelmente fiz demais hackers de scripts de shell.
ddaa 13/01/10
The file system does not know anything about it.+1
Bin
15

Provavelmente porque o Python não é Bash e não segue as mesmas convenções. Você pode usar isto:

homedir = os.path.expanduser('~')
gruszczy
fonte
0
from srblib import verify_folder

verify_folder('path/to/folder')

Ele criará uma pasta, caso contrário, não criará uma pasta.

NOTA : também criará pastas no caminho (se necessário)

srb@srb-pc:~/hello$ ls
srb@srb-pc:~/hello$ python3 
>>> from srblib import verify_folder
>>> verify_folder('~/hello/A/B')
>>> exit()
srb@srb-pc:~/hello$ ls
A
srb@srb-pc:~/hello$ ls A
B
srb@srb-pc:~/hello$ 

Esta função funciona como mkdir -p path/to/folder

srbcheema1
fonte
0

Agora você pode fazer isso como

from srbib import abs_path
my_dir = abs_path('~/path/to/dir')
if not os.path.exists(my_dir):
    os.makedirs(my_dir)

Consulte https://stackoverflow.com/a/54190233/6799074 para obter o uso desrblib.abs_path

srbcheema1
fonte