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 и сделал то, что сделал OP, а python создал каталог «~» в моем текущем каталоге. Как я могу удалить этот каталог (без удаления самого домашнего каталога)?
— Счастливый Миттал

1
@HappyMittal, если кому-то интересно, вы можете просто использовать ./для ссылки на ваш текущий каталог и, таким образом, ./~для удаления папки ~в текущем каталоге. Чтобы быть безопаснее, проще просто указать полный путь: rm -rf path/to/bad/dir/~.
— алказм

Или просто избежать обратной косой черты:rm \~
— DDMC

71

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

В Python эта функция реализована с помощью os.path.expanduser :

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

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

7
Обратите внимание, что можно получить доступ к файлу / директории с именем «~» в текущем каталоге, даже когда происходит расширение тильды, используя нотацию «./~». Это работает, потому что расширение происходит только в начале имени файла. Это также удобный хак для имен файлов, начинающихся с «-» или других символов, которые обрабатываются специально интерфейсами командной строки. Вы могли бы сказать, что я, вероятно, слишком много взломал сценариев оболочки.
— 2010 года

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.