os.path.dirname (__ file__) kembali kosong

165

Saya ingin mendapatkan jalur direktori saat ini di mana file .py dieksekusi.

Misalnya file sederhana D:\test.pydengan kode:

import os

print os.getcwd()
print os.path.basename(__file__)
print os.path.abspath(__file__)
print os.path.dirname(__file__)

Sungguh aneh bahwa hasilnya adalah:

D:\
test.py
D:\test.py
EMPTY

Saya mengharapkan hasil yang sama dari getcwd()dan path.dirname().

Diberikan os.path.abspath = os.path.dirname + os.path.basename, mengapa

os.path.dirname(__file__)

kembali kosong?

Mengelupas
sumber

Jawaban:

257

Karena os.path.abspath = os.path.dirname + os.path.basenametidak tahan. kami lebih suka memiliki

os.path.dirname(filename) + os.path.basename(filename) == filename

Keduanya dirname()danbasename() hanya membagi nama file yang dilewatkan menjadi komponen tanpa memperhitungkan direktori saat ini. Jika Anda ingin juga mempertimbangkan direktori saat ini, Anda harus melakukannya secara eksplisit.

Untuk mendapatkan dirname dari path absolut, gunakan

os.path.dirname(os.path.abspath(__file__))
Sven Marnach
sumber
3
Hai Sven, Anda benar, seharusnya os.path.dirname (os.path.abspath ( file )). Terima kasih! Hanya FYI, Anda mendapatkan kesalahan ketik kecil di baris terakhir.
Serpihan
11
perhatikan komentar di atas memiliki huruf tebal di mana harus ada garis bawah pada kedua sisi karena format markdown. jawaban aslinya diubah dengan benar
watsonic
1
Perhatikan bahwa kami tidak pernah memilikinya os.path.dirname(filename) + os.path.basename(filename) == filenamekarena pemisah direktori tidak ada. Kami lebih suka memiliki:os.path.join(os.path.dirname(filename), os.path.basename(filename)) == filename
Jean Paul
Saya bingung, haruskah Anda meninggalkan basedir = os.path.abspath (os.path.dirname ( file )) di program Anda? atau apa yang Anda ganti atau di mana Anda mengganti jalur Anda seperti C: \ Users \ Test \ app.db?
0004
@ pes04 __file__memperluas ke nama file saat ini, sehingga Anda dapat menggunakan salinan kata demi kata dari jawaban ini.
Sven Marnach
9

dapat digunakan juga seperti itu:

dirname(dirname(abspath(__file__)))
adnan dogar
sumber
7
import os.path

dirname = os.path.dirname(__file__) or '.'
Deve
sumber
6
os.path.split(os.path.realpath(__file__))[0]

os.path.realpath(__file__)kembalikan abspath dari skrip saat ini; os.path.split (abspath) [0] mengembalikan dir saat ini

RY Zheng
sumber
5
print(os.path.join(os.path.dirname(__file__))) 

Anda juga bisa menggunakan cara ini

Mikhail
sumber