溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

在Python中如何以絕對路徑或者相對路徑導(dǎo)入文件

發(fā)布時間:2021-08-17 11:57:09 來源:億速云 閱讀:4109 作者:小新 欄目:開發(fā)技術(shù)

這篇文章將為大家詳細講解有關(guān)在Python中如何以絕對路徑或者相對路徑導(dǎo)入文件,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

1、在Python中以相對路徑或者絕對路徑來導(dǎo)入文件或者模塊的方法

在調(diào)試代碼的時候,程序一直提示沒有該模塊,一直很納悶,因為我導(dǎo)入文件一直是用絕對路徑進行導(dǎo)入的。按道理來講是不會出現(xiàn)模塊找不到的情況的。

最后仔細分析了整個代碼的目錄結(jié)構(gòu),才發(fā)現(xiàn)了問題。

下面依次來說明一下今天的情況

先看導(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)魅氲氖俏募奈恢?,這個函數(shù)是讀取配置文件的內(nèi)容

然后看一下目錄的結(jié)構(gòu)

在Python中如何以絕對路徑或者相對路徑導(dǎo)入文件 

在此例中,demo_mnist,py為主文件。它第一處要導(dǎo)入的是它當(dāng)前目錄的父目錄下的一個子目錄中的一個目錄中的文件。

所以以絕對路徑導(dǎo)入這個文件就是 from lib.gcforest.gcforet import GCForest

以相對路徑導(dǎo)入這個文件就是 from ..gcforest.gcforet import GCForest

第二處導(dǎo)入的是它統(tǒng)一個目錄下的另一個文件,所以可以直接導(dǎo)入
所以修改的導(dǎo)入代碼為:config = load_json("demo_mnist-ca.json")

2、 順便復(fù)習(xí)一下相對路徑和絕對路徑的概念

絕對路徑就是文件的真正存在的路徑,是指從硬盤的根目錄(盤符)開始,進行一級級目錄指向文件。

相對路徑就是以當(dāng)前文件為基準(zhǔn)進行一級級目錄指向被引用的資源文件。

以下是常用的表示當(dāng)前目錄和當(dāng)前目錄的父級目錄的標(biāo)識符

../ 表示當(dāng)前文件所在的目錄的上一級目錄
./ 表示當(dāng)前文件所在的目錄(可以省略)
/ 表示當(dāng)前站點的根目錄(域名映射的硬盤目錄)

在Python中可以驗證一下上述的標(biāo)識方法:

測試的目錄結(jié)構(gòu):

在Python中如何以絕對路徑或者相對路徑導(dǎo)入文件

import os
path2=os.path.abspath('.') # 表示當(dāng)前所處的文件夾的絕對路徑
print(path2)
path3=os.path.abspath('..') # 表示當(dāng)前所處的文件夾上一級文件夾的絕對路徑
print(path3)
# 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 環(huán)境下使用: .

sys.path.append(‘你的模塊的名稱')。
sys.path.insert(0,'模塊的名稱')

添加相關(guān)的路徑,但在退出python環(huán)境后自己添加的路徑就會自動消失!

代碼中的實現(xiàn)如下:

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時執(zhí)行的代碼,當(dāng)然也可以留空就可以.

import home.a.b

方法三:

from home.a.b import *

前提 home、a中都包括__init__.py 即:要導(dǎo)入的文件的當(dāng)前目錄和父目錄都要有init.py文件

Python包含子目錄中的模塊方法比較簡單,關(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或其他目錄(平級)下的模塊
如下面程序結(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)境變量的值,找到具體模塊的路徑。這里僅介紹上面三種簡單情況。

關(guān)于“在Python中如何以絕對路徑或者相對路徑導(dǎo)入文件”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI