Python's os.makedirs nie rozumie „~” na mojej ścieżce

159

Mam mały problem z ~ na moich ścieżkach.

Ten przykład kodu tworzy katalogi o nazwie „~ / jakiś_katalog” i nie rozumiem, że chciałem utworzyć jakiś_katalog w moim katalogu domowym.

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

Zauważ, że jest to w systemie opartym na systemie Linux.

Johan
źródło

Odpowiedzi:

277

Musisz ręcznie rozwinąć tyldę:

my_dir = os.path.expanduser('~/some_dir')
SilentGhost
źródło
1
Więc nie użyłem os.path.expanduser i zrobiłem to, co zrobił OP, a Python utworzył katalog "~" w moim bieżącym katalogu. Jak mogę usunąć ten katalog (bez usuwania rzeczywistego katalogu domowego)?
Happy Mittal
1
@HappyMittal dla innych zastanawiających się, możesz po prostu użyć ./do odniesienia do bieżącego katalogu, a tym samym ./~do usunięcia folderu ~w bieżącym katalogu. Aby być bezpieczniejsze, to najłatwiej jest po prostu podać pełną ścieżkę: rm -rf path/to/bad/dir/~.
alkasm
Lub po prostu rm \~
ucieknij
71

Konwersja ~/some_dirdo $HOME/some_dirjest nazywana rozszerzeniem tyldy i jest powszechną funkcją interfejsu użytkownika. System plików nic o tym nie wie.

W Pythonie ta funkcja jest implementowana przez os.path.expanduser :

my_dir = os.path.expanduser("~/some_dir")
ddaa
źródło
Rzeczywiście, posiadanie nazwy pliku lub katalogu jest całkowicie poprawne ~. Tak więc skrót do strony głównej powłoki jest niejednoznaczny i najlepiej go unikać, jeśli możesz.
bobince
7
Zauważ, że można uzyskać dostęp do pliku / katalogu o nazwie „~” w bieżącym katalogu, nawet jeśli występuje rozwinięcie tyldy, używając notacji „./~”. To działa, ponieważ rozszerzenie ~ występuje tylko na początku nazwy pliku. Jest to również wygodny sposób na nazwy plików zaczynające się od „-” lub innych znaków, które są traktowane specjalnie przez interfejsy linii poleceń. Można powiedzieć, że prawdopodobnie za dużo hakowałem skryptów powłoki.
ddaa
The file system does not know anything about it.+1
Bin
15

Dzieje się tak prawdopodobnie dlatego, że Python nie jest Bash i nie przestrzega tych samych konwencji. Możesz użyć tego:

homedir = os.path.expanduser('~')
gruszczy
źródło
0
from srblib import verify_folder

verify_folder('path/to/folder')

Utworzy folder, jeśli nie, to nie utworzy folderu.

UWAGA : utworzy również foldery w ścieżce (jeśli jest to wymagane)

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$ 

Ta funkcja działa jak mkdir -p path/to/folder

srbcheema1
źródło