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.

Johan
la source

Réponses:

277

Vous devez développer le tilde manuellement:

my_dir = os.path.expanduser('~/some_dir')
SilentGhost
la source
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")
ddaa
la source
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('~')
gruszczy
la source
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

srbcheema1
la source
0

Vous pouvez maintenant le faire comme

from srbib import abs_path
my_dir = abs_path('~/path/to/dir')
if not os.path.exists(my_dir):
    os.makedirs(my_dir)

Veuillez consulter https://stackoverflow.com/a/54190233/6799074 pour l'utilisation desrblib.abs_path

srbcheema1
la source