2017-04-04 84 views
0

我發現腳本的「當前工作目錄」最初不是腳本所在的位置,而是他/她運行腳本時的用戶。如何處理文件路徑?

如果腳本是在/Desktop/Projects/pythonProject/myscript.py,但我在我的終端/Documents/Arbitrary我,當我運行該腳本,那麼這將是它的當前工作目錄,並在open('data.txt')試圖要給未找到文件,因爲它是不在正確的目錄中查找。

那麼腳本應該如何打開文件,如果它不知道它從哪裏運行?這是如何處理的?

我最初的想法是使用絕對路徑。假設我的腳本需要打開data.txt,並將其存儲在其包pythonProject中。那麼我只想說open('/Desktop/Projects/pythonProject/data.txt')

但是,如果不修改其中的每條路徑,就無法移動該項目,所以這不可能是正確的解決方案。

或者只是您的答案只是您必須在您運行腳本時腳本所在的目錄中?這似乎也不錯。

有沒有一些簡單的操作,這我沒有想到?您是否應該在腳本的開頭將os.chdir添加到腳本的位置?

+0

您可以使用'__file__'確定腳本的位置。 – smarx

+0

[我如何獲取當前正在執行的文件的路徑和名稱?](http://stackoverflow.com/questions/50499/how-do-i-get-the-path-and-name當前正在執行的文件) – congusbongus

回答

2

import os 
file_dir = os.path.dirname(os.path.abspath(os.path.realpath(__file__))) 

然後,要創建跨平臺的文件路徑,使用os.path.join()

os.path.join(file_dir, "test.txt") 

或者,你可以改變當前工作目錄到正在運行的文件的目錄,所以你不必os.path.join每次:

os.path.chdir(os.path.dirname(os.path.abspath(os.path.realpath(__file__)))) 

爲什麼使用os.path.abspathos.path.realpath?內部realpath解析符號鏈接,而abspath解析相對路徑。如果您確定沒有使用符號鏈接,則可以省略此內部呼叫。

+0

這是一個很好的答案,但是如果腳本接受文件的名稱作爲命令行參數執行操作,並且只使用這些技術來定位靜態他們需要操作的文件。 – cco

+0

接受動態文件名作爲命令行參數似乎不在問題範圍內。 – Julien

+0

這就是爲什麼我加入了我的想法作爲評論。這個問題似乎沒有考慮接受一個文件名作爲替代,事實上它是一種常見模式。對於所問的問題,你的回答是很好的答案。 – cco

1

模塊的位置總是在__file__變量中可用。您可以在os.path使用的功能(我主要是想BASEDIR,並加入)使用os.path.dirnameos.path.abspathos.path.realpath__file__變量獲取當前文件的目錄路徑,以模塊相對路徑轉換爲絕對路徑