我正在学习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
建議你稍微瀏覽一下Python doc:os.path,你就會理解囉:
我放上重慶相關的幾個入境問題:
os.path.abspath(path)
返迴路徑名路徑的規範化絕對化版本。在大多數平台上,這相當於呼叫函數normpath(),如下所示:normpath(join(os.getcwd(), path)).
os.path.normpath(path)
透過折疊冗餘分隔符號和上層引用來規範路徑名,以便 A//B、A/B/、A/./B 和 A/foo/../B 全部變成 A/B。此字串操作可能會變更包含符號連結的路徑的含義。在 Windows 上,它將正斜線轉換為反斜線。要標準化大小寫,請使用normcase()。
os.path.dirname(path)
返回pathname路徑的目錄名稱。這是透過將路徑傳遞給函數 split() 傳回的對的第一個元素。
os.path.split(path)
將路徑名路徑分成一對,(頭,尾),其中尾部是最後一個路徑名組件,頭是導致它的所有內容。尾部永遠不會包含斜線;如果路徑以斜線結尾,則 tail 將為空。如果路徑中沒有斜杠,則 head 將為空。如果路徑為空,則頭部和尾部都為空。尾部斜線將從頭部剝離,除非它是根(僅一個或多個斜線)。在所有情況下, join(head, tail) 傳回與 path 相同位置的路徑(但字串可能不同)。另請參閱函數 dirname() 和 basename()。
我們做以下觀察:
test.py
運行:
雷雷結果:
雷雷首先__file__
的值其實就是在命令列上呼叫Python時給的腳本名稱:
在這裡,因為 __file__
的值為 test.py
, 所以 print(__file__)
的結果是 test.py
的值是
print(__file__)
的結果是 也不意外了。 os.path.dirname(__file__)
之所以得出空白(空字串), 是因為 __file__
就只是一個單純的名稱(非路徑) 且 dirname
也只是很單純的利用 os.path.split()
os.path.dirname(__file__)
此時剩餘空白(空字符串),是因為就只是一個簡單的名稱(非路徑)且dirname
也只是很簡單的利用os.path.split()
來切割這個名稱(這當然沒有好切的,連路徑分割符都沒有):head
是空字串, 所以 dirname
雷雷
結果是空白。 abspath
動用了 os.getcwd()
所以神聖給定了簡單的名稱,也能返迴路徑:os.path.abspath(os.path.dirname(__file__))
的結果就等於是 os.getcwd()
的結果去接上 dirname
雷雷
得到的空字串:os.path.dirname(os.path.abspath(__file__))
雷雷
的結果是這麼來的:
雷雷 🎜希望講到這裡能讓你明白! 🎜現在簡單的回答你的問題
為什麼 dirname
出現空白?
因為你運行的時候給的是單純的名稱, 所以 __file__
是單純的名字非路徑
我怎麼能夠知道,括號內的檔案是以相對路徑還是絕對路徑被運行的?
很簡單, 就看你怎麼運行 Python 的
為什麼我運行下面範例腳本的時候,這個檔案是以相對路徑被運行的呢?
因為 $ python 1.py
你自己給了相對路徑
os.path.abspath(os.path.dirname(__file__))
和 os.path.dirname(os.path.abspath(__file__))
性質是否一樣呢?
基本上一樣
我回答過的問題: Python-QA