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.