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.

Respostas:


277

Você precisa expandir o til manualmente:

my_dir = os.path.expanduser('~/some_dir')

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")

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('~')

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


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.