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.