Os.makedirs Python не понимает «~» на моем пути

159

У меня есть небольшая проблема с ~ в моих путях.

Этот пример кода создает некоторые каталоги с именем ~ / some_dir и не понимает, что я хотел создать some_dir в моем домашнем каталоге.

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

Обратите внимание, что это в системе на основе Linux.

Johan
источник

Ответы:

277

Вам необходимо расширить тильду вручную:

my_dir = os.path.expanduser('~/some_dir')
SilentGhost
источник
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")
ddaa
источник
Действительно, и вполне допустимо иметь имя файла или каталога ~. Таким образом, ярлык оболочки дома является неоднозначным и лучше избегать, если вы можете.
bobince
7
Обратите внимание, что можно получить доступ к файлу / директории с именем «~» в текущем каталоге, даже когда происходит расширение тильды, используя нотацию «./~». Это работает, потому что расширение происходит только в начале имени файла. Это также удобный хак для имен файлов, начинающихся с «-» или других символов, которые обрабатываются специально интерфейсами командной строки. Вы могли бы сказать, что я, вероятно, слишком много взломал сценариев оболочки.
2010 года
The file system does not know anything about it.+1
бин
15

Это, вероятно, потому что Python не Bash и не следует тем же соглашениям. Вы можете использовать это:

homedir = os.path.expanduser('~')
gruszczy
источник
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

srbcheema1
источник
0

Теперь вы можете сделать это как

from srbib import abs_path
my_dir = abs_path('~/path/to/dir')
if not os.path.exists(my_dir):
    os.makedirs(my_dir)

Пожалуйста, обратитесь к https://stackoverflow.com/a/54190233/6799074 для использованияsrblib.abs_path

srbcheema1
источник