詳解在Python中以絕對(duì)路徑或者相對(duì)路徑導(dǎo)入文件的方法
1、在Python中以相對(duì)路徑或者絕對(duì)路徑來(lái)導(dǎo)入文件或者模塊的方法
今天在調(diào)試代碼的時(shí)候,程序一直提示沒(méi)有該模塊,一直很納悶,因?yàn)槲覍?dǎo)入文件一直是用絕對(duì)路徑進(jìn)行導(dǎo)入的。按道理來(lái)講是不會(huì)出現(xiàn)模塊找不到的情況的。
最后仔細(xì)分析了整個(gè)代碼的目錄結(jié)構(gòu),才發(fā)現(xiàn)了問(wèn)題。
下面依次來(lái)說(shuō)明一下今天的情況
先看導(dǎo)入的代碼:
在demo——mnist.py文件中執(zhí)行以下兩種導(dǎo)入操作 # 第一處 from gcforest.gcforest import GCForest from gcforest.utils.config_utils import load_json # 第二處 config = load_json("demo_mnist-ca.json") # 里面?zhèn)魅氲氖俏募奈恢?,這個(gè)函數(shù)是讀取配置文件的內(nèi)容
然后看一下目錄的結(jié)構(gòu)
在此例中,demo_mnist,py為主文件。它第一處要導(dǎo)入的是它當(dāng)前目錄的父目錄下的一個(gè)子目錄中的一個(gè)目錄中的文件。
所以以絕對(duì)路徑導(dǎo)入這個(gè)文件就是 from lib.gcforest.gcforet import GCForest
以相對(duì)路徑導(dǎo)入這個(gè)文件就是 from ..gcforest.gcforet import GCForest
第二處導(dǎo)入的是它統(tǒng)一個(gè)目錄下的另一個(gè)文件,所以可以直接導(dǎo)入
所以修改的導(dǎo)入代碼為:config = load_json("demo_mnist-ca.json")
2、 順便復(fù)習(xí)一下相對(duì)路徑和絕對(duì)路徑的概念
絕對(duì)路徑就是文件的真正存在的路徑,是指從硬盤(pán)的根目錄(盤(pán)符)開(kāi)始,進(jìn)行一級(jí)級(jí)目錄指向文件。
相對(duì)路徑就是以當(dāng)前文件為基準(zhǔn)進(jìn)行一級(jí)級(jí)目錄指向被引用的資源文件。
以下是常用的表示當(dāng)前目錄和當(dāng)前目錄的父級(jí)目錄的標(biāo)識(shí)符
../ 表示當(dāng)前文件所在的目錄的上一級(jí)目錄
./ 表示當(dāng)前文件所在的目錄(可以省略)
/ 表示當(dāng)前站點(diǎn)的根目錄(域名映射的硬盤(pán)目錄)
在Python中可以驗(yàn)證一下上述的標(biāo)識(shí)方法:
測(cè)試的目錄結(jié)構(gòu):
import os path1=os.path.abspath('.') # 表示當(dāng)前所處的文件夾的絕對(duì)路徑 print(path1) path2=os.path.abspath('..') # 表示當(dāng)前所處的文件夾上一級(jí)文件夾的絕對(duì)路徑 print(path2)
# D:/PycharmProjects/mnistCheck/AbsolutepathAndrelativepath.py D:\PycharmProjects\mnistCheck D:\PycharmProjects
3、 再了解一下Python sys.path的使用
sys.path是python的搜索模塊的路徑集,是一個(gè)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 環(huán)境下使用: .
sys.path.append(‘你的模塊的名稱')。 sys.path.insert(0,'模塊的名稱')
添加相關(guān)的路徑,但在退出python環(huán)境后自己添加的路徑就會(huì)自動(dòng)消失!
代碼中的實(shí)現(xiàn)如下:
import sys sys.path.append('C:\Users\Administrator\Desktop\ExperimentAss\gcForest-master')
4、最后了解一下 python 在不同層級(jí)目錄import 模塊的方法(重點(diǎn))
有一個(gè)文件夾/home/a, 里面有個(gè)模塊叫b.py, 我怎么把他import到程序里?
方法一: (屬于剛開(kāi)始分析的代碼里第一種情況)
import sys; sys.path.append(“/home/a/”) import b
方法二:
在目錄里面增加__init__.py文件,里面可以寫(xiě)import時(shí)執(zhí)行的代碼,當(dāng)然也可以留空就可以.
import home.a.b
方法三:
from home.a.b import *
前提 home、a中都包括__init__.py 即:要導(dǎo)入的文件的當(dāng)前目錄和父目錄都要有init.py文件
Python包含子目錄中的模塊方法比較簡(jiǎn)單,關(guān)鍵是能夠在sys.path里面找到通向模塊文件的路徑。
下面將具體介紹幾種常用情況:
(1)主程序與模塊程序在同一目錄下:
如下面程序結(jié)構(gòu):
– src |– mod1.py |– test1.py
若在程序test1.py中導(dǎo)入模塊mod1, 則直接使用import mod1或from mod1 import *;
(2)主程序所在目錄是模塊所在目錄的父(或祖輩)目錄
如下面程序結(jié)構(gòu):
– src |– mod1.py |– mod2 | – mod2.py – test1.py
若在程序test1.py中導(dǎo)入模塊mod2, 需要在mod2文件夾中建立空文件__init__.py文件(也可以在該文件中自定義輸出模塊接口); 然后使用 from mod2.mod2 import * 或import mod2.mod2.
(3)主程序?qū)肷蠈幽夸浿心K或其他目錄(平級(jí))下的模塊
如下面程序結(jié)構(gòu):
– src |– mod1.py |– mod2 |– mod2.py |– sub | – test2.py – test1.py
若在程序test2.py中導(dǎo)入模塊mod1.py和mod2.py。首先需要在mod2下建立__init__.py文件(同(2)),src下不必建立該文件。然后調(diào)用方式如下:
下面程序執(zhí)行方式均在程序文件所在目錄下執(zhí)行,如test2.py是在cd sub;之后執(zhí)行python test2.py
而test1.py是在cd src;之后執(zhí)行python test1.py; 不保證在src目錄下執(zhí)行python sub/test2.py成功。
import sys sys.path.append(“..”) import mod1 import mod2.mod2
(4)從(3)可以看出,導(dǎo)入模塊關(guān)鍵是能夠根據(jù)sys.path環(huán)境變量的值,找到具體模塊的路徑。這里僅介紹上面三種簡(jiǎn)單情況。
總結(jié):
通過(guò)總結(jié)可以發(fā)現(xiàn),當(dāng)你要導(dǎo)入的文件在和你的當(dāng)前文件在同一個(gè)目錄時(shí),你直接導(dǎo)入這個(gè)文件名就好了。
當(dāng)你要導(dǎo)入的文件或者目錄不和你的當(dāng)前文件同目錄時(shí),你需要跳到這個(gè)你要導(dǎo)入文件的父級(jí)目錄,然后一級(jí)一級(jí)的用點(diǎn)號(hào)連接走過(guò)的目錄或者文件,然后就可以了 至于要怎么跳到這個(gè)這個(gè)父級(jí)目錄。比較通用的就是,將父級(jí)目錄加入系統(tǒng)路徑,然后用點(diǎn)號(hào)一級(jí)一級(jí)的尋找,直到到達(dá)你要導(dǎo)入的模塊。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
在python中以相同順序shuffle兩個(gè)list的方法
今天小編就為大家分享一篇在python中以相同順序shuffle兩個(gè)list的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12Pandas數(shù)據(jù)分析之pandas數(shù)據(jù)透視表和交叉表
這篇文章主要介紹了Pandas數(shù)據(jù)分析之pandas數(shù)據(jù)透視表和交叉表,pandas對(duì)數(shù)據(jù)框也可以像excel一樣進(jìn)行數(shù)據(jù)透視表整合之類的操作。主要是針對(duì)分類數(shù)據(jù)進(jìn)行操作,還可以計(jì)算數(shù)值型數(shù)據(jù),去滿足復(fù)雜的分類數(shù)據(jù)整理的邏輯2022-08-08django實(shí)現(xiàn)web接口 python3模擬Post請(qǐng)求方式
今天小編就為大家分享一篇django實(shí)現(xiàn)web接口 python3模擬Post請(qǐng)求方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11如何將numpy二維數(shù)組中的np.nan值替換為指定的值
這篇文章主要介紹了將numpy二維數(shù)組中的np.nan值替換為指定的值操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05python實(shí)現(xiàn)csv格式文件轉(zhuǎn)為asc格式文件的方法
下面小編就為大家分享一篇python實(shí)現(xiàn)csv格式文件轉(zhuǎn)為asc格式文件的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03Python有關(guān)Unicode UTF-8 GBK編碼問(wèn)題詳解
本文主要介紹了Python有關(guān)Unicode UTF-8 GBK編碼問(wèn)題詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08python問(wèn)題匯總之pycharm查找不到安裝的庫(kù)解決
這篇文章主要給大家介紹了關(guān)于python問(wèn)題匯總之pycharm查找不到安裝庫(kù)的解決方法,PyCharm是一款非常流行的Python集成開(kāi)發(fā)環(huán)境(IDE),它提供了豐富的功能和插件,可以幫助程序員更高效地編寫(xiě)Python代碼,需要的朋友可以參考下2023-09-09