Os.makedirs Python tidak mengerti "~" di jalan saya

159

Saya punya sedikit masalah dengan ~ di jalur saya.

Contoh kode ini membuat beberapa direktori yang disebut "~ / some_dir" dan tidak mengerti bahwa saya ingin membuat some_dir di direktori home saya.

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

Perhatikan ini pada sistem berbasis Linux.

Johan
sumber

Jawaban:

277

Anda perlu memperluas tilde secara manual:

my_dir = os.path.expanduser('~/some_dir')
SilentGhost
sumber
1
Jadi saya tidak menggunakan os.path.expanduser, dan melakukan apa yang OP lakukan, dan python membuat direktori "~" di direktori saya saat ini. Bagaimana saya bisa menghapus direktori itu (tanpa menghapus direktori home yang sebenarnya)?
Happy Mittal
1
@HappyMittal untuk orang lain bertanya-tanya, Anda bisa menggunakan ./referensi direktori Anda saat ini, dan dengan demikian ./~untuk menghapus folder ~di direktori saat ini. Untuk lebih aman, itu termudah untuk hanya memberikan path lengkap: rm -rf path/to/bad/dir/~.
alkasm
Atau hanya menghindarinya dengan backslash:rm \~
DDMC
71

Konversi ~/some_dirke $HOME/some_dirdisebut ekspansi tilde dan merupakan fitur antarmuka pengguna yang umum. Sistem file tidak tahu apa-apa tentang itu.

Dalam Python, fitur ini diterapkan oleh os.path.expanduser :

my_dir = os.path.expanduser("~/some_dir")
ddaa
sumber
Memang, dan sangat sah untuk memiliki nama file atau direktori ~. Jadi pintasan shell home adalah ambigu dan sebaiknya dihindari jika Anda bisa.
bobince
7
Perhatikan bahwa seseorang BISA mengakses file / dir bernama "~" di direktori saat ini bahkan ketika ekspansi tilde terjadi, menggunakan notasi "./~". Itu bekerja karena ~ ekspansi hanya terjadi pada awal nama file. Ini juga peretasan yang nyaman untuk nama file yang dimulai dengan "-" atau karakter lain yang diperlakukan secara khusus oleh antarmuka baris perintah. Bisa dibilang saya mungkin telah melakukan terlalu banyak peretasan shell script.
ddaa
The file system does not know anything about it.+1
Bin
15

Itu mungkin karena Python bukan Bash dan tidak mengikuti konvensi yang sama. Anda dapat menggunakan ini:

homedir = os.path.expanduser('~')
gruszczy
sumber
0
from srblib import verify_folder

verify_folder('path/to/folder')

Ini akan membuat folder jika tidak ada di sana itu tidak akan membuat folder.

CATATAN : itu juga akan membuat folder di jalur (jika diperlukan)

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$ 

Fungsi ini berfungsi seperti mkdir -p path/to/folder

srbcheema1
sumber
0

Anda sekarang dapat melakukannya seperti

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

Silakan merujuk ke https://stackoverflow.com/a/54190233/6799074 untuk penggunaansrblib.abs_path

srbcheema1
sumber