详解在Python中以绝对路径或者相对路径导⼊⽂件的⽅法1、在Python中以相对路径或者绝对路径来导⼊⽂件或者模块的⽅法
今天在调试代码的时候,程序⼀直提⽰没有该模块,⼀直很纳闷,因为我导⼊⽂件⼀直是⽤绝对路径进⾏导⼊的。按道理来讲是不会出现模块不到的情况的。
最后仔细分析了整个代码的⽬录结构,才发现了问题。
下⾯依次来说明⼀下今天的情况
先看导⼊的代码:
在demo——mnist.py⽂件中执⾏以下两种导⼊操作
# 第⼀处
forest import GCForest
from fig_utils import load_json
# 第⼆处
config = load_json("demo_mnist-ca.json") # ⾥⾯传⼊的是⽂件的位置,这个函数是读取配置⽂件的内容
然后看⼀下⽬录的结构
在此例中,demo_mnist,py为主⽂件。它第⼀处要导⼊的是它当前⽬录的⽗⽬录下的⼀个⼦⽬录中的⼀个⽬录中的⽂件。
所以以绝对路径导⼊这个⽂件就是foret import GCForest
以相对路径导⼊这个⽂件就是from ..foret import GCForestpython怎么读文件夹下的文件夹
第⼆处导⼊的是它统⼀个⽬录下的另⼀个⽂件,所以可以直接导⼊
所以修改的导⼊代码为: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\\Anacond ]
可以在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⽂件(也可以在该⽂件中⾃定义输出模块接⼝); 然后使⽤ d2 import * 或d2.
(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
d2
(4)从(3)可以看出,导⼊模块关键是能够根据sys.path环境变量的值,到具体模块的路径。这⾥仅介绍上⾯三种简单情况。
总结:
通过总结可以发现,当你要导⼊的⽂件在和你的当前⽂件在同⼀个⽬录时,你直接导⼊这个⽂件名就好了。
当你要导⼊的⽂件或者⽬录不和你的当前⽂件同⽬录时,你需要跳到这个你要导⼊⽂件的⽗级⽬录,然后⼀级⼀级的⽤点号连接⾛过的⽬录或者⽂件,然后就可以了⾄于要怎么跳到这个这个⽗级⽬录。
⽐较通⽤的就是,将⽗级⽬录加⼊系统路径,然后⽤点号⼀级⼀级的寻,直到到达你要导⼊的模块。
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论