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.