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.