Os.makedirs de Python ne comprend pas «~» dans mon chemin


159

J'ai un petit problème avec ~ dans mes chemins.

Cet exemple de code crée des répertoires appelés "~ / some_dir" et je ne comprends pas que je voulais créer some_dir dans mon répertoire personnel.

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

Notez que ceci est sur un système basé sur Linux.

Réponses:


277

Vous devez développer le tilde manuellement:

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

1
Je n'ai donc pas utilisé os.path.expanduser, et j'ai fait ce que l'OP a fait, et python a créé le répertoire "~" dans mon répertoire actuel. Comment puis-je supprimer ce répertoire (sans supprimer le répertoire personnel actuel)?
Happy Mittal

1
@HappyMittal pour les autres, vous pouvez simplement l'utiliser ./pour référencer votre répertoire actuel, et ainsi ./~supprimer le dossier ~dans le répertoire courant. Pour être plus sûr, il est plus facile de simplement fournir le chemin complet: rm -rf path/to/bad/dir/~.
alkasm

Ou tout simplement échapper avec une barre oblique inverse:rm \~
DDMC

71

La conversion de ~/some_diren $HOME/some_direst appelée expansion tilde et est une fonctionnalité courante de l'interface utilisateur. Le système de fichiers n'en sait rien.

En Python, cette fonctionnalité est implémentée par os.path.expanduser :

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

En effet, et il est parfaitement valable d'avoir un fichier ou un répertoire nommé ~. Ainsi, le raccourci vers la page d'accueil du shell est ambigu et mieux vaut éviter si vous le pouvez.
bobince

7
Notez que l'on PEUT accéder à un fichier / répertoire nommé "~" dans le répertoire courant même lorsque l'expansion du tilde se produit, en utilisant la notation "./~". Cela fonctionne car l'extension ~ ne se produit qu'au début d'un nom de fichier. C'est aussi un hack pratique pour les noms de fichiers commençant par "-" ou d'autres caractères qui sont traités spécialement par les interfaces de ligne de commande. Vous pourriez dire que j'ai probablement fait beaucoup trop de piratage de scripts shell.
ddaa du

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

15

C'est probablement parce que Python n'est pas Bash et ne suit pas les mêmes conventions. Vous pouvez utiliser ceci:

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

0
from srblib import verify_folder

verify_folder('path/to/folder')

Il créera un dossier sinon là, il ne créera pas de dossier.

REMARQUE : il créera également des dossiers dans le chemin (si nécessaire)

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$ 

Cette fonction fonctionne comme mkdir -p path/to/folder


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.