kode ini adalah templat / blog1 / page.html di b.py:
path = os.path.join(os.path.dirname(__file__), os.path.join('templates', 'blog1/page.html'))
tetapi saya ingin mendapatkan lokasi dir induk:
aParent
|--a
| |---b.py
| |---templates
| |--------blog1
| |-------page.html
|--templates
|--------blog1
|-------page.html
dan cara mendapatkan lokasi aParent
Terima kasih
diperbarui:
ini benar:
dirname=os.path.dirname
path = os.path.join(dirname(dirname(__file__)), os.path.join('templates', 'blog1/page.html'))
atau
path = os.path.abspath(os.path.join(os.path.dirname(__file__),".."))
blog1
ataua
? Dan di mana file Anda saat ini berada?os.path.join('templates', 'blog1/page.html')
terlihat aneh bagiku. Anda mencampuradukkan hal-hal. Entahos.path.join('templates', 'blog1', 'page.html')
atau'templates/blog1/page.html'
. Dan jauh lebih mudah kalauos.path.abspath(os.path.join('templates', 'blog1', 'page.html'))
begituJawaban:
Anda dapat menerapkan dirname berulang kali untuk naik lebih tinggi:
dirname(dirname(file))
. Ini hanya bisa sejauh paket root, namun. Jika ini adalah masalah, gunakanos.path.abspath
:dirname(dirname(abspath(file)))
.sumber
dirname
. Tidak jelas bagi semua orang bahwa menerapkan dirname ke direktori menghasilkan direktori induk.dirname
tidak tidak selalu mengembalikan direktori induk; twitter.com/#!/ActiveState/status/671049326788608/
sebagai tidak mewakili entri direktori daun itu sendiri, tetapi isinya, itulah sebabnya, misalnya,mv xxx yyy/
gagal jikayyy
bukan direktori yang sudah ada sebelumnya. Dalam kasus apa pun, bahkan jika kami menganggap pendapat Anda sebagai yang diberikan, itu tidak relevan dalam konteks jawaban saya. Baikfile
hasil daridirname
akan pernah berakhir dengan/
.dirname
dapat kembali'/'
, yang jelas berakhir dengan a/
. Itulah satu-satunya pengecualian, AFAIK.os.path.abspath
tidak memvalidasi apa pun, jadi jika kita sudah menambahkan string ke__file__
tidak perlu repot dengandirname
atau bergabung atau apa pun. Cukup perlakukan__file__
sebagai direktori dan mulailah mendaki:Itu jauh lebih berbelit-belit daripada
os.path.abspath(os.path.join(os.path.dirname(__file__),".."))
sekitar bisa dikeloladirname(dirname(__file__))
. Mendaki lebih dari dua tingkat mulai menjadi konyol.Tapi, karena kita tahu berapa level yang harus didaki, kita bisa membersihkannya dengan fungsi kecil sederhana:
sumber
os.path.abspath(os.path.join(__file__, "..", "..")
lebih portabel?Gunakan jalur relatif dengan
pathlib
modul dalam Python 3.4+:Anda dapat menggunakan beberapa panggilan
parent
untuk melangkah lebih jauh di jalur:Sebagai alternatif untuk menetapkan
parent
dua kali, Anda dapat menggunakan:sumber
str(Path(__file__).parent)
.Harus memberi Anda jalan ke
a
.Tetapi jika
b.py
file yang sedang dieksekusi, maka Anda dapat mencapai hal yang sama dengan hanya melakukansumber
dirname()
dua kali. Semua yang Anda butuhkan sekarang harus ada di situs ini.os.pardir
adalah cara yang lebih baik../
dan lebih mudah dibaca.Ini akan mengembalikan path induk dari given_path
sumber
Cara sederhana dapat:
sumber
Bisa gabung dua
..
folder, untuk mendapatkan induk dari folder induk?sumber
Gunakan yang berikut untuk melompat ke folder sebelumnya:
Jika Anda membutuhkan beberapa lompatan, solusi yang baik dan mudah adalah menggunakan dekorator sederhana dalam kasus ini.
sumber
Berikut ini adalah solusi lain yang relatif sederhana yaitu:
dirname()
(yang tidak berfungsi seperti yang diharapkan pada argumen satu tingkat seperti "file.txt" atau orang tua relatif seperti "..")abspath()
(menghindari asumsi tentang direktori kerja saat ini) tetapi malah mempertahankan karakter relatif dari pathhanya menggunakan
normpath
danjoin
:Hasil:
sumber
Saya pikir menggunakan ini lebih baik:
sumber
Saya mencoba:
sumber