Os.makedirs Python не розуміє "~" на моєму шляху


159

У мене невеликі проблеми з ~ на моїх шляхах.

Цей приклад коду створює деякі каталоги під назвою "~ / some_dir" і не розумію, що я хотів створити some_dir у своєму домашньому каталозі.

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

Зауважте, це в системі на базі Linux.

Відповіді:


277

Тильду потрібно розгорнути вручну:

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

1
Тому я не використовував os.path.expanduser, і робив те, що робив ОП, і python створив каталог "~" у моєму поточному каталозі. Як я можу видалити цей каталог (не видаляючи фактичного домашнього каталогу)?
Happy Mittal

1
@HappyMittal для інших, хто цікавиться, ви можете просто скористатися ./посиланням на ваш поточний каталог і тим самим ./~видалити папку ~в поточному каталозі. Щоб бути безпечніше, простіше просто вказати повний шлях: rm -rf path/to/bad/dir/~.
alkasm

Або просто втекти від цього нахилом:rm \~
DDMC

71

Перетворення ~/some_dirдо $HOME/some_dirназивається розширенням тильди і є загальною особливістю інтерфейсу користувача. Файлова система про це нічого не знає.

У Python цю функцію реалізує os.path.expanduser :

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

Дійсно, і цілком справедливо мати файл чи каталог ~. Тож ярлик для домашньої оболонки неоднозначний і найкраще уникати, якщо зможете.
bobince

7
Зауважте, що один CAN може отримати доступ до файлу / dir з назвою "~" у поточному каталозі, навіть коли відбувається розширення tilde, використовуючи позначення "./~". Це працює, тому що ~ розширення відбувається лише на початку імені файлу. Це також зручний злом для імен файлів, що починаються з "-" або інших символів, які спеціально обробляються інтерфейсами командного рядка. Ви можете сказати, що я, мабуть, зробив занадто багато зламування сценарію оболонки.
ddaa

The file system does not know anything about it.+1
Бін

15

Це, мабуть, тому, що Python не є Bash і не дотримується тих самих умов. Ви можете скористатися цим:

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

0
from srblib import verify_folder

verify_folder('path/to/folder')

Він створить папку, якщо не буде іншого, то не зможе створити папку.

ПРИМІТКА : він також створить папки в шляху (якщо потрібно)

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$ 

Ця функція працює як mkdir -p path/to/folder


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.