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.