詳解在Python中以絕對路徑或者相對路徑匯入檔案的方法
1、在Python中以相對路徑或者絕對路徑來匯入檔案或者模組的方法
今天在除錯程式碼的時候,程式一直提示沒有該模組,一直很納悶,因為我匯入檔案一直是用絕對路徑進行匯入的。按道理來講是不會出現模組找不到的情況的。
最後仔細分析了整個程式碼的目錄結構,才發現了問題。
下面依次來說明一下今天的情況
先看匯入的程式碼:
在demo——mnist.py檔案中執行以下兩種匯入操作 # 第一處 from gcforest.gcforest import GCForest from gcforest.utils.config_utils import load_json # 第二處 config = load_json("demo_mnist-ca.json") # 裡面傳入的是檔案的位置,這個函式是讀取配置檔案的內容
然後看一下目錄的結構
在此例中,demo_mnist,py為主檔案。它第一處要匯入的是它當前目錄的父目錄下的一個子目錄中的一個目錄中的檔案。
所以以絕對路徑匯入這個檔案就是 from lib.gcforest.gcforet import GCForest
以相對路徑匯入這個檔案就是 from ..gcforest.gcforet import GCForest
第二處匯入的是它統一個目錄下的另一個檔案,所以可以直接匯入
所以修改的匯入程式碼為:config = load_json("demo_mnist-ca.json")
2、 順便複習一下相對路徑和絕對路徑的概念
絕對路徑就是檔案的真正存在的路徑,是指從硬碟的根目錄(碟符)開始,進行一級級目錄指向檔案。
相對路徑就是以當前檔案為基準進行一級級目錄指向被引用的資原始檔。
以下是常用的表示當前目錄和當前目錄的父級目錄的識別符號
../ 表示當前檔案所在的目錄的上一級目錄
./ 表示當前檔案所在的目錄(可以省略)
/ 表示當前站點的根目錄(域名對映的硬碟目錄)
在Python中可以驗證一下上述的標識方法:
測試的目錄結構:
import os path1=os.path.abspath('.') # 表示當前所處的資料夾的絕對路徑 print(path1) path2=os.path.abspath('..') # 表示當前所處的資料夾上一級資料夾的絕對路徑 print(path2)
# D:/PycharmProjects/mnistCheck/AbsolutepathAndrelativepath.py D:\PycharmProjects\mnistCheck D:\PycharmProjects
3、 再瞭解一下Python sys.path的使用
sys.path是python的搜尋模組的路徑集,是一個list,如下:
[ 'D:\\PycharmProjects\\mnistCheck','D:\\PycharmProjects\\mnistCheck','D:\\PycharmProjects\\KerasDataSettry','C:\\ProgramData\\Anaconda3\\envs\\tensorflow\\python35.zip','C:\\ProgramData\\Anaconda3\\envs\\tensorflow\\DLLs','C:\\ProgramData\\Anaconda3\\envs\\tensorflow\\lib','C:\\ProgramData\\Anaconda3\\envs\\tensorflow','C:\\ProgramData\\Anaconda3\\envs\\tensorflow\\lib\\site-packages','C:\\ProgramData\\Anaconda3\\envs\\tensorflow\\lib\\site-packages\\Sphinx-1.6.3-py3.5.egg' ]
可以在python 環境下使用: .
sys.path.append(‘你的模組的名稱')。 sys.path.insert(0,'模組的名稱')
新增相關的路徑,但在退出python環境後自己新增的路徑就會自動消失!
程式碼中的實現如下:
import sys sys.path.append('C:\Users\Administrator\Desktop\ExperimentAss\gcForest-master')
4、最後瞭解一下 python 在不同層級目錄import 模組的方法(重點)
有一個資料夾/home/a,裡面有個模組叫b.py,我怎麼把他import到程式裡?
方法一: (屬於剛開始分析的程式碼裡第一種情況)
import sys; sys.path.append(“/home/a/”) import b
方法二:
在目錄裡面增加__init__.py檔案,裡面可以寫import時執行的程式碼,當然也可以留空就可以.
import home.a.b
方法三:
from home.a.b import *
前提 home、a中都包括__init__.py 即:要匯入的檔案的當前目錄和父目錄都要有init.py檔案
Python包含子目錄中的模組方法比較簡單,關鍵是能夠在sys.path裡面找到通向模組檔案的路徑。
下面將具體介紹幾種常用情況:
(1)主程式與模組程式在同一目錄下:
如下面程式結構:
– src |– mod1.py |– test1.py
若在程式test1.py中匯入模組mod1,則直接使用import mod1或from mod1 import *;
(2)主程式所在目錄是模組所在目錄的父(或祖輩)目錄
如下面程式結構:
– src |– mod1.py |– mod2 | – mod2.py – test1.py
若在程式test1.py中匯入模組mod2,需要在mod2資料夾中建立空檔案__init__.py檔案(也可以在該檔案中自定義輸出模組介面); 然後使用 from mod2.mod2 import * 或import mod2.mod2.
(3)主程式匯入上層目錄中模組或其他目錄(平級)下的模組
如下面程式結構:
– src |– mod1.py |– mod2 |– mod2.py |– sub | – test2.py – test1.py
若在程式test2.py中匯入模組mod1.py和mod2.py。首先需要在mod2下建立__init__.py檔案(同(2)),src下不必建立該檔案。然後呼叫方式如下:
下面程式執行方式均在程式檔案所在目錄下執行,如test2.py是在cd sub;之後執行python test2.py
而test1.py是在cd src;之後執行python test1.py; 不保證在src目錄下執行python sub/test2.py成功。
import sys sys.path.append(“..”) import mod1 import mod2.mod2
(4)從(3)可以看出,匯入模組關鍵是能夠根據sys.path環境變數的值,找到具體模組的路徑。這裡僅介紹上面三種簡單情況。
總結:
通過總結可以發現,當你要匯入的檔案在和你的當前檔案在同一個目錄時,你直接匯入這個檔名就好了。
當你要匯入的檔案或者目錄不和你的當前檔案同目錄時,你需要跳到這個你要匯入檔案的父級目錄,然後一級一級的用點號連線走過的目錄或者檔案,然後就可以了 至於要怎麼跳到這個這個父級目錄。比較通用的就是,將父級目錄加入系統路徑,然後用點號一級一級的尋找,直到到達你要匯入的模組。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。