在配置檔案中開啟其他檔案時路徑的處理
阿新 • • 發佈:2018-11-06
雖然有軟體目錄開發規範,可以在啟動檔案裡向下面這樣新增BASE_DIR:
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
但是平時自己寫指令碼的時候,並不想搞得太正規。但是在一個程式中需要開啟某個檔案是時候,又會遇到路徑的問題。
這裡是開啟檔案,不是載入模組。如果是import的問題,只需要呼叫 sys.path.append(DIR)
,把某個目錄加到環境變數中去就可以了。
問題場景
有一個配置檔案 settings.py ,不想把密碼等敏感資訊寫在配置檔案裡,所以單獨建立了一個檔案 password.txt 用於存放密碼等敏感資訊,假設就在同一個資料夾下,那麼 settings.py 要載入 password.txt 裡的內容,需要開啟檔案:
file = open("password.txt")
啟動同一資料夾下的程式,讀取配置檔案都沒有問題。但是如果程式在別的位置,就會報錯。找不到 password.txt 檔案。原因很簡單,啟動路徑變了。
上面的做法,都是把啟動檔案的資料夾作為相對路徑的當前目錄,然後查詢要開啟的檔案。
分析和解決
不想把路徑寫死,否則路徑的位置或者中間的任何資料夾的名稱變動,都會影響查詢檔案。就需要用動態的方法獲取到路徑。__file__
是用來獲得模組所在的路徑的。這可能得到的是一個相對路徑,也可能是絕對路徑。按絕對路徑執行則得到的是絕對路徑,按相對路徑執行則得到的是相對路徑。相對路徑或絕對路徑都無所謂。
在 settings.py 裡獲取 __file__
import settings
就沒有問題了。路徑的處理,就是 os.path 模組:
# 在 settings.py 檔案中 dir_name = os.path.dirname(__file__) # 動態的獲取到資料夾的路徑 fine_name = "password.txt" # 同一資料夾下的檔名 pass_file = os.path.join(dir_name, fine_name) # 拼接出完整的檔案路徑 file = open(pass_file)