Os.makedirs di Python non capisce "~" nel mio percorso


159

Ho un piccolo problema con ~ nei miei percorsi.

Questo esempio di codice crea alcune directory chiamate "~ / some_dir" e non capisco che volevo creare some_dir nella mia home directory.

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

Nota che questo è su un sistema basato su Linux.

Risposte:


277

Devi espandere manualmente la tilde:

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

1
Quindi non ho usato os.path.expanduser, e ho fatto quello che ha fatto l'OP, e python ha creato la directory "~" nella mia directory corrente. Come posso eliminare quella directory (senza rimuovere la home directory effettiva)?
Happy Mittal,

1
@HappyMittal per gli altri che si chiedono, puoi semplicemente usare ./per fare riferimento alla tua directory corrente e quindi ./~rimuovere la cartella ~nella directory corrente. Per essere più sicuro, è più facile per fornire semplicemente il percorso completo: rm -rf path/to/bad/dir/~.
alkasm

O semplicemente sfuggire a una barra rovesciata:rm \~
DDMC

71

La conversione di ~/some_dirto $HOME/some_dirsi chiama espansione tilde ed è una caratteristica dell'interfaccia utente comune. Il file system non ne sa nulla.

In Python, questa funzione è implementata da os.path.expanduser :

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

Anzi, ed è perfettamente valido avere un file o una directory denominata ~. Quindi la scorciatoia home della shell è ambigua e, se possibile, è meglio evitarla.
bobince

7
Si noti che si può accedere a un file / dir chiamato "~" nella directory corrente anche quando si verifica l'espansione tilde, usando la notazione "./~". Ciò funziona perché l'espansione ~ si verifica solo all'inizio del nome di un file. È anche un pratico trucco per i nomi di file che iniziano con "-" o altri caratteri trattati in modo speciale dalle interfacce della riga di comando. Si potrebbe dire che probabilmente ho fatto troppi hacking di script di shell.
ddaa,

The file system does not know anything about it.+1
Bin

15

Questo probabilmente perché Python non è Bash e non segue le stesse convenzioni. Puoi usare questo:

homedir = os.path.expanduser('~')

0
from srblib import verify_folder

verify_folder('path/to/folder')

Creerà una cartella se non lì non creerà una cartella.

NOTA : creerà anche cartelle nel percorso (se richiesto)

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$ 

Questa funzione funziona come mkdir -p path/to/folder


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.