Pythons os.makedirs versteht "~" auf meinem Weg nicht

159

Ich habe ein kleines Problem mit ~ auf meinen Wegen.

Dieses Codebeispiel erstellt einige Verzeichnisse mit dem Namen "~ / some_dir" und versteht nicht, dass ich some_dir in meinem Home-Verzeichnis erstellen wollte.

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

Beachten Sie, dass dies auf einem Linux-basierten System ist.

Johan
quelle

Antworten:

277

Sie müssen die Tilde manuell erweitern:

my_dir = os.path.expanduser('~/some_dir')
SilentGhost
quelle
1
Also habe ich os.path.expanduser nicht verwendet und das getan, was das OP getan hat, und Python hat das Verzeichnis "~" in meinem aktuellen Verzeichnis erstellt. Wie kann ich dieses Verzeichnis löschen (ohne das eigentliche Ausgangsverzeichnis zu entfernen)?
Happy Mittal
1
@HappyMittal für andere, die sich fragen, können Sie einfach verwenden, ./um auf Ihr aktuelles Verzeichnis zu verweisen und so ./~den Ordner ~im aktuellen Verzeichnis zu entfernen . Um sicherer zu sein, ist es am einfachsten, einfach den vollständigen Pfad anzugeben : rm -rf path/to/bad/dir/~.
Alkasm
Oder entkommen Sie einfach mit einem Backslash:rm \~
DDMC
71

Die Konvertierung von ~/some_dirin $HOME/some_dirwird als Tilde-Erweiterung bezeichnet und ist eine allgemeine Funktion der Benutzeroberfläche. Das Dateisystem weiß nichts darüber.

In Python wird diese Funktion von os.path.expanduser implementiert :

my_dir = os.path.expanduser("~/some_dir")
ddaa
quelle
In der Tat, und es ist vollkommen gültig, eine Datei oder ein Verzeichnis mit dem Namen zu haben ~. Die Shell-Home-Verknüpfung ist also mehrdeutig und wird am besten vermieden, wenn Sie können.
Bobince
7
Beachten Sie, dass man mit der Notation "./~" auf eine Datei / ein Verzeichnis mit dem Namen "~" im aktuellen Verzeichnis zugreifen kann, auch wenn eine Tilde-Erweiterung stattfindet. Das funktioniert, weil die ~ Erweiterung nur am Anfang eines Dateinamens erfolgt. Es ist auch ein praktischer Hack für Dateinamen, die mit "-" beginnen, oder für andere Zeichen, die speziell von Befehlszeilenschnittstellen behandelt werden. Sie können sehen, dass ich wahrscheinlich viel zu viel Shell-Skript-Hacking durchgeführt habe.
Ddaa
The file system does not know anything about it.+1
Bin
15

Das liegt wahrscheinlich daran, dass Python nicht Bash ist und nicht denselben Konventionen folgt. Sie können dies verwenden:

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

verify_folder('path/to/folder')

Es wird ein Ordner erstellt, wenn es nicht vorhanden ist. Andernfalls wird kein Ordner erstellt.

HINWEIS : Außerdem werden Ordner im Pfad erstellt (falls erforderlich).

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$ 

Diese Funktion funktioniert wie mkdir -p path/to/folder

srbcheema1
quelle