Bisakah seseorang memberi tahu saya cara mendapatkan direktori induk dari jalur di Python dengan cara lintas platform. Misalnya
C:\Program Files ---> C:\
dan
C:\ ---> C:\
Jika direktori tidak memiliki direktori induk, ia mengembalikan direktori itu sendiri. Pertanyaannya mungkin tampak sederhana tetapi saya tidak dapat menggali melalui Google.
os.path.dirname
adalah fungsi untuk ini, sukaa+=5-4
lebih berbelit daripadaa+=1
. Pertanyaan yang diminta hanya direktori induk, bukan apakah ada atau direktori induk sebenarnya dengan asumsi tautan simbolik menghalangios.pardir
, tidakos.path.pardir
.os.pardir
danos.path.pardir
sebenarnya benar (keduanya identik).os.path.dirname
memberikan hasil yang berbeda tergantung pada apakah garis miring disertakan di jalan. Jika Anda ingin hasil yang dapat diandalkan, Anda perlu menggunakanos.path.join
metode dalam jawaban di atas.Menggunakan
os.path.dirname
:Peringatan:
os.path.dirname()
memberikan hasil yang berbeda tergantung pada apakah garis miring dimasukkan dalam jalur. Ini mungkin atau mungkin bukan semantik yang Anda inginkan. Lih @ jawab kender menggunakanos.path.join(yourpath, os.pardir)
.sumber
os.path.dirname(r'C:\Program Files')
apa? Python hanya memberi Anda direktori tempat file 'Program Files' berada. Terlebih lagi, bahkan tidak harus ada, lihat:os.path.dirname(r'c:\i\like\to\eat\pie')
output'c:\\i\\like\\to\\eat'
Metode Pathlib (Python 3.4+)
Metode tradisional
Metode mana yang harus saya gunakan?
Gunakan metode tradisional jika:
Anda khawatir tentang kesalahan pembuatan kode yang ada jika menggunakan objek Pathlib. (Karena objek Pathlib tidak dapat digabungkan dengan string.)
Versi Python Anda kurang dari 3,4.
Anda membutuhkan string, dan Anda menerima string. Katakan misalnya Anda memiliki string yang mewakili sebuah file tap, dan Anda ingin mendapatkan direktori induk sehingga Anda dapat meletakkannya di string JSON. Akan agak konyol untuk mengkonversi ke objek Pathlib dan kembali lagi untuk itu.
Jika tidak ada yang di atas berlaku, gunakan Pathlib.
Apa itu Pathlib?
Jika Anda tidak tahu apa itu Pathlib, modul Pathlib adalah modul hebat yang membuat bekerja dengan file lebih mudah bagi Anda. Sebagian besar jika tidak semua modul Python bawaan yang berfungsi dengan file akan menerima objek dan string Pathlib. Saya telah menyoroti di bawah ini beberapa contoh dari dokumentasi Pathlib yang menampilkan beberapa hal rapi yang dapat Anda lakukan dengan Pathlib.
Menavigasi di dalam pohon direktori:
Properti jalur kueri:
sumber
pip install pathlib2
dan gunakan backport.os.sep
!C:\Program Files
--->C:\\\
C:\
--->C:\\\
sumber
os.path.abspath(r'E:\O3M_Tests_Embedded\branches\sw_test_level_gp\test_scripts\..\..')
Hasil:E:\\O3M_Tests_Embedded\\branches
/
.Solusi alternatif @kender
di mana
yourpath
jalur yang Anda inginkan untuk orang tua.Tetapi solusi ini tidak sempurna, karena tidak akan menangani kasus di mana
yourpath
string kosong, atau sebuah titik.Solusi lain ini akan menangani kasus sudut ini dengan lebih baik:
Di sini keluaran untuk setiap kasus yang dapat ditemukan (Jalur input relatif):
Jalur input mutlak (jalur Linux):
sumber
sumber
os.path.split(os.path.abspath("this/is/a/dir/"))[0]
kembali'/home/daniel/this/is/a'
seperti yang diharapkan. Saya tidak memiliki kotak Windows yang sedang berjalan untuk memeriksa di sana. Pada pengaturan apa yang telah Anda amati perilaku yang Anda laporkan?parentdir = os.path.split(os.path.apspath(dir[:-1]))[0]
. Ini - saya yakin - berfungsi karena jika ada garis miring pada ujungnya, maka garis tersebut akan dihapus; jika tidak ada garis miring, ini masih akan berhasil (bahkan jika bagian terakhir dari jalur hanya sepanjang satu karakter) karena garis miring sebelumnya. Ini tentu saja mengasumsikan bahwa path itu benar dan tidak mengatakan sesuatu seperti/a//b/c///d////
(dalam unix ini masih valid), yang dalam kebanyakan kasus mereka (benar) terutama ketika Anda melakukan sesuatu sepertios.path.abspath
atauos.path
fungsi lainnya .os.path.split("a/b//c/d///")
dan, misalnya,cd //////dev////// is equivalent to
cd / dev / `ataucd /dev
; semua ini berlaku di linux. Aku hanya datang dengan ini dan itu mungkin berguna, meskipun:os.path.split(path[:tuple(ind for ind, char in enumerate(path) if char != "/" and char != "\\")[-1]])[0]
. (Ini pada dasarnya mencari non-slash terakhir, dan mendapatkan substring dari path ke char itu.) Saya menggunakanpath = "/a//b///c///d////"
dan kemudian menjalankan pernyataan tersebut dan mendapatkan'/a//b///c'
.Mengamati:
sumber
sumber
Jika Anda ingin hanya satu nama dari folder yang merupakan induk langsung dari file yang disediakan sebagai argumen dan tidak dengan path absolut ke file yang:
os.path.split(os.path.dirname(currentDir))[1]
yaitu dengan
currentDir
nilai/home/user/path/to/myfile/file.ext
Perintah di atas akan kembali:
myfile
sumber
Misalnya di Ubuntu:
Misalnya di Windows:
Kedua contoh dicoba dengan Python 2.7
sumber
sumber
Misalkan kita memiliki struktur direktori seperti
1]
Kami ingin mengakses jalur "P" dari direktori R maka kami dapat mengakses menggunakan
2]
Kami ingin mengakses jalur direktori "Q" dari direktori R maka kami dapat mengakses menggunakan
sumber
Hanya menambahkan sesuatu ke jawaban Tung (Anda harus menggunakan
rstrip('/')
untuk menjadi lebih aman jika Anda menggunakan kotak unix).Tetapi, jika Anda tidak menggunakannya
rstrip('/')
, berikan masukan Andaakan menghasilkan,
yang mungkin bukan apa yang Anda lihat karena Anda ingin keduanya
"../data/replies/"
dan"../data/replies"
berperilaku dengan cara yang sama.sumber
sumber
Anda dapat menggunakan ini untuk mendapatkan direktori induk dari lokasi saat ini dari file py Anda.
sumber
DAPATKAN Path Direktori Induk dan buat Direktori baru (nama
new_dir
)Dapatkan Jalur Direktori Induk
Contoh 1
Contoh 2
sumber
Jadi sangat
..
membantusumber
sumber
Jawaban yang diberikan di atas semuanya baik-baik saja untuk naik satu atau dua tingkat direktori, tetapi mereka mungkin agak rumit jika seseorang perlu melintasi pohon direktori dengan banyak tingkatan (katakanlah, 5 atau 10). Ini dapat dilakukan secara ringkas dengan bergabung dengan daftar
N
os.pardir
s dios.path.join
. Contoh:sumber