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.

Antworten:


277

Sie müssen die Tilde manuell erweitern:

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

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

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

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


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.