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.

Jawaban:


277

Anda perlu memperluas tilde secara manual:

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

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")

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('~')

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


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.