Rumah > Soal Jawab > teks badan
我正在学习Python,不过遇到一些问题,想请教
OS模块中的os.path.dirname(__file__)和os.path.abspath(__file__)
运行os.path.dirname(__file__)时候,为什么返回的是空白呢?是不是因为他运行的是相对路径???
如果是的话:
1:我怎么能够知道,括号内的文件是以相对路径还是绝对路径被运行的?
2:为什么我运行下面例子脚本的时候,这个文件是以相对路径被运行的呢?
比如我下面的例子
import os
print (os.path.dirname(__file__))
print (os.path.abspath(__file__))
print (os.path.abspath(os.path.dirname(__file__)))
print (os.path.dirname(os.path.abspath(__file__)))
PS:附加问题
os.path.abspath(os.path.dirname(__file__))和os.path.dirname(os.path.abspath(__file__))性质是否一样呢?
迷茫2017-04-18 09:19:06
建議你可以稍微瀏覽一下 Dokumen Python: os.path, 你就會明白囉:
我放上跟你問題相關的幾個條目:
os.path.abspath(path)
Kembalikan versi mutlak laluan nama laluan yang dinormalkan. Pada kebanyakan platform, ini bersamaan dengan memanggil fungsi normpath() seperti berikut: normpath(join(os.getcwd(), path)).
os.path.normpath(path)
Normalkan nama laluan dengan meruntuhkan pemisah berlebihan dan rujukan peringkat atas supaya A//B, A/B/, A/./B dan A/foo/../B semuanya menjadi A /B. Manipulasi rentetan ini mungkin mengubah maksud laluan yang mengandungi pautan simbolik. Pada Windows, ia menukar garis miring ke hadapan kepada garis miring ke belakang. Untuk menormalkan kes, gunakan normcase().
os.path.dirname(path)
Kembalikan nama direktori laluan nama laluan. Ini ialah elemen pertama pasangan yang dikembalikan dengan menghantar laluan ke pemisahan fungsi().
os.path.split(path)
Pisah laluan nama laluan kepada pasangan, (kepala, ekor) dengan ekor ialah komponen nama laluan terakhir dan kepala ialah segala-galanya yang membawa kepada itu. Bahagian ekor tidak akan pernah mengandungi garis miring; jika laluan berakhir dengan garis miring, ekor akan kosong. Jika tiada garis miring di laluan, kepala akan kosong. Jika laluan kosong, kedua-dua kepala dan ekor kosong. Tebasan mengekor dilucutkan dari kepala melainkan ia adalah akar (satu atau lebih garisan sahaja). Dalam semua kes, join(kepala, ekor) mengembalikan laluan ke lokasi yang sama seperti laluan (tetapi rentetan mungkin berbeza). Lihat juga fungsi diname() dan basename().
我們做以下觀察:
test.py
import os
print(__file__)
print(os.path.dirname(__file__))
print(os.path.abspath(__file__))
print(os.path.abspath(os.path.dirname(__file__)))
print(os.path.dirname(os.path.abspath(__file__)))
運行:
$ pwd
/home/dokelung
$ python test.py
結果:
test.py
/home/dokelung/test.py
/home/dokelung
/home/dokelung
首先 __file__
的值其實就是在命令列上 invoke Python 時給的 script 名稱:
$ python test.py # 此時 __file__ 是 test.py
$ python ../test.py # 此時 __file__ 是 ../test.py
$ python hello/../test.py # 此時 __file__ 是 hello/../test.py
在這裡, 因為 __file__
的值為 test.py
, 所以 print(__file__)
的結果是 test.py
也就不意外了>。<🎜
之所以得出空白(空字串), 是因為 os.path.dirname(__file__)
就只是一個單純的名純的名矯(名為)只是很單純的利用 __file__
來切割這個名稱(這當然沒甚麼好切的, 連路徑分割符都沒有):dirname
>>> import os
>>> os.path.split('test.py')
('', 'test.py')
>>> os.path.split('test.py')[0]
''
os.path.split()
我分會發現切出來的 是空字串, 所以 的結果是空白。head
dirname
所以即便給定的是單純的名稱, 也能返回路徑:abspath
>>> os.getcwd()
'/home/dokelung'
>>> os.path.join(os.getcwd(), 'test.py')
'/home/dokelung/test.py'
>>> os.path.normpath(os.path.join(os.getcwd(), 'test.py'))
'/home/dokelung/test.py'
os.getcwd()
而 的結果就等於是 的結果去接上 os.path.abspath(os.path.dirname(__file__))
得到的空字串:os.getcwd()
>>> os.path.dirname('test.py')
''
>>> os.path.join(os.getcwd(), os.path.dirname('test.py'))
'/home/dokelung/'
dirname
最後, 的結果是這麼來的:
>>> os.path.abspath('test.py')
'/home/dokelung/test.py'
>>> os.path.split(os.path.abspath('test.py'))
('/home/dokelung', 'test.py')
>>> os.path.split(os.path.abspath('test.py'))[0]
'/home/dokelung'
os.path.dirname(os.path.abspath(__file__))
希望講到這裡有讓你明白!Sekarang jawab soalan anda secara ringkas
Mengapa dirname
kosong?
Oleh kerana anda memberi nama yang mudah semasa berlari, jadi __file__
adalah nama yang mudah dan bukan laluan
Bagaimanakah saya boleh mengetahui sama ada fail dalam kurungan dijalankan dengan laluan relatif atau laluan mutlak?
Ia sangat mudah, ia bergantung pada cara anda menjalankan Python
Mengapa fail ini dijalankan dengan laluan relatif apabila saya menjalankan skrip contoh di bawah?
Kerana $ python 1.py
anda sendiri yang memberi laluan relatif
os.path.abspath(os.path.dirname(__file__))
dan os.path.dirname(os.path.abspath(__file__))
mempunyai sifat yang sama?
Pada asasnya sama
Soalan yang saya jawab: Python-QA