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.