详解在Python中以绝对路径或者相对路径导入文件的方法


Posted in Python onAugust 30, 2019

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") # 里面传入的是文件的位置,这个函数是读取配置文件的内容

然后看一下目录的结构

详解在Python中以绝对路径或者相对路径导入文件的方法 

在此例中,demo_mnist,py为主文件。它第一处要导入的是它当前目录的父目录下的一个子目录中的一个目录中的文件。

所以以绝对路径导入这个文件就是 from lib.gcforest.gcforet import GCForest

以相对路径导入这个文件就是 from ..gcforest.gcforet import GCForest

第二处导入的是它统一个目录下的另一个文件,所以可以直接导入
所以修改的导入代码为:config = load_json("demo_mnist-ca.json")

2、 顺便复习一下相对路径和绝对路径的概念

绝对路径就是文件的真正存在的路径,是指从硬盘的根目录(盘符)开始,进行一级级目录指向文件。

相对路径就是以当前文件为基准进行一级级目录指向被引用的资源文件。

以下是常用的表示当前目录和当前目录的父级目录的标识符

../ 表示当前文件所在的目录的上一级目录
./ 表示当前文件所在的目录(可以省略)
/ 表示当前站点的根目录(域名映射的硬盘目录)

在Python中可以验证一下上述的标识方法:

测试的目录结构:

详解在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环境变量的值,找到具体模块的路径。这里仅介绍上面三种简单情况。

总结:

通过总结可以发现,当你要导入的文件在和你的当前文件在同一个目录时,你直接导入这个文件名就好了。

当你要导入的文件或者目录不和你的当前文件同目录时,你需要跳到这个你要导入文件的父级目录,然后一级一级的用点号连接走过的目录或者文件,然后就可以了 至于要怎么跳到这个这个父级目录。比较通用的就是,将父级目录加入系统路径,然后用点号一级一级的寻找,直到到达你要导入的模块。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现监控linux性能及进程消耗性能的方法
Jul 25 Python
让python在hadoop上跑起来
Jan 27 Python
python编程实现归并排序
Apr 14 Python
100行python代码实现跳一跳辅助程序
Jan 15 Python
10个Python小技巧你值得拥有
Sep 29 Python
pygame游戏之旅 调用按钮实现游戏开始功能
Nov 21 Python
Python 脚本获取ES 存储容量的实例
Dec 27 Python
python读取几个G的csv文件方法
Jan 07 Python
python Matplotlib底图中鼠标滑过显示隐藏内容的实例代码
Jul 31 Python
python 实现分组求和与分组累加求和代码
May 18 Python
基于Tensorflow的MNIST手写数字识别分类
Jun 17 Python
Python3自带工具2to3.py 转换 Python2.x 代码到Python3的操作
Mar 03 Python
Django使用uwsgi部署时的配置以及django日志文件的处理方法
Aug 30 #Python
Python matplotlib生成图片背景透明的示例代码
Aug 30 #Python
Python 批量刷博客园访问量脚本过程解析
Aug 30 #Python
快速解决docker-py api版本不兼容的问题
Aug 30 #Python
Python 使用 Pillow 模块给图片添加文字水印的方法
Aug 30 #Python
python pillow模块使用方法详解
Aug 30 #Python
docker-py 用Python调用Docker接口的方法
Aug 30 #Python
You might like
php实现的获取网站备案信息查询代码(360)
2013/09/23 PHP
10个对初学者非常有用的PHP技巧
2016/04/06 PHP
PHP文件操作实例总结【文件上传、下载、分页】
2018/12/08 PHP
[Web]防止用户复制页面内容和另存页面的方法
2009/02/06 Javascript
javascript 年月日联动实现核心代码
2009/12/21 Javascript
js 判断上传文件大小及格式代码
2013/11/13 Javascript
AngularJS中实现显示或隐藏动画效果的方式总结
2015/12/31 Javascript
基于javascript html5实现多文件上传
2016/03/03 Javascript
Google 地图类型详解及示例代码
2016/08/06 Javascript
js获取Get值的方法
2016/09/29 Javascript
微信小程序 页面跳转和数据传递实例详解
2017/01/19 Javascript
微信小程序 ecshop地址三级联动实现实例代码
2017/02/28 Javascript
详解angular2封装material2对话框组件
2017/03/03 Javascript
使用typescript开发angular模块并发布npm包
2018/04/19 Javascript
在Vant的基础上封装下拉日期控件的代码示例
2018/12/05 Javascript
详解VUE调用本地json的使用方法
2019/05/15 Javascript
微信小程序拼接图片链接无底洞深入探究
2019/09/03 Javascript
Vue页面手动刷新,实现导航栏激活项还原到初始状态
2020/08/06 Javascript
Vue解决移动端弹窗滚动穿透问题
2020/12/15 Vue.js
[22:20]初生之犊-TI4第5名LGD战队纪录片
2014/08/13 DOTA
[34:08]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS EG
2018/03/30 DOTA
python将html转成PDF的实现代码(包含中文)
2013/03/04 Python
Python抓取电影天堂电影信息的代码
2016/04/07 Python
深入浅析python中的多进程、多线程、协程
2016/06/22 Python
python 连接sqlite及简单操作
2017/06/30 Python
Python中数组,列表:冒号的灵活用法介绍(np数组,列表倒序)
2018/04/18 Python
Python设计模式之备忘录模式原理与用法详解
2019/01/15 Python
使用pytorch实现可视化中间层的结果
2019/12/30 Python
中国旅游网站:途牛旅游网
2019/09/29 全球购物
DBA的职责都有哪些
2012/05/16 面试题
财务工作个人求职的自我评价
2013/12/19 职场文书
乡镇平安建设汇报材料
2014/08/25 职场文书
资源环境与城乡规划管理专业自荐书
2014/09/26 职场文书
2015年个人现实表现材料
2014/12/10 职场文书
优秀党务工作者先进事迹材料
2014/12/25 职场文书
SQL 窗口函数实现高效分页查询的案例分析
2021/05/21 SQL Server