El os.makedirs de Python no entiende "~" en mi camino


159

Tengo un pequeño problema con ~ en mis caminos.

Este ejemplo de código crea algunos directorios llamados "~ / some_dir" y no entiendo que quería crear some_dir en mi directorio de inicio.

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

Tenga en cuenta que esto está en un sistema basado en Linux.

Respuestas:


277

Necesita expandir la tilde manualmente:

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

1
Así que no usé os.path.expanduser, e hice lo que hizo el OP, y Python creó el directorio "~" en mi directorio actual. ¿Cómo puedo eliminar ese directorio (sin eliminar el directorio de inicio real)?
Happy Mittal

1
@HappyMittal para otros que se preguntan, simplemente puede usar ./para hacer referencia a su directorio actual, y así ./~eliminar la carpeta ~en el directorio actual. Para ser más seguro, lo más fácil es simplemente proporcionar la ruta completa: rm -rf path/to/bad/dir/~.
alkasm

O simplemente escape con una barra invertida:rm \~
DDMC

71

La conversión de ~/some_dira $HOME/some_dirse llama expansión tilde y es una característica común de la interfaz de usuario. El sistema de archivos no sabe nada al respecto.

En Python, esta característica es implementada por os.path.expanduser :

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

De hecho, y es perfectamente válido tener un archivo o directorio llamado ~. Por lo tanto, el acceso directo de inicio de shell es ambiguo y es mejor evitarlo si puede.
bobince

77
Tenga en cuenta que uno PUEDE acceder a un archivo / directorio llamado "~" en el directorio actual, incluso cuando se produce una expansión de tilde, utilizando la notación "./~". Eso funciona porque ~ la expansión solo ocurre al comienzo de un nombre de archivo. También es un truco conveniente para los nombres de archivos que comienzan con "-" u otros caracteres que son tratados especialmente por las interfaces de línea de comandos. Se podría decir que probablemente he hecho demasiado hackeo de script de shell.
ddaa

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

15

Probablemente sea porque Python no es Bash y no sigue las mismas convenciones. Puedes usar esto:

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

0
from srblib import verify_folder

verify_folder('path/to/folder')

Creará una carpeta si no existe, no creará una carpeta.

NOTA : también creará carpetas en la ruta (si es necesario)

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$ 

Esta función funciona como mkdir -p path/to/folder


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.