详解在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使用shelve模块实现简单数据存储的方法
May 20 Python
Python求出0~100以内的所有素数
Jan 23 Python
python 时间信息“2018-02-04 18:23:35“ 解析成字典形式的结果代码详解
Apr 19 Python
tensorflow更改变量的值实例
Jul 30 Python
从运行效率与开发效率比较Python和C++
Dec 14 Python
Python实现删除排序数组中重复项的两种方法示例
Jan 31 Python
django基于restframework的CBV封装详解
Aug 08 Python
Keras 切换后端方式(Theano和TensorFlow)
Jun 19 Python
通过自学python能找到工作吗
Jun 21 Python
利用python+ffmpeg合并B站视频及格式转换的实例代码
Nov 24 Python
Python pandas读取CSV文件的注意事项(适合新手)
Jun 20 Python
pycharm安装深度学习pytorch的d2l包失败问题解决
Mar 25 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安全配置
2006/12/06 PHP
PHP中的MYSQL常用函数(php下操作数据库必备)
2010/09/12 PHP
yii操作cookie实例简介
2014/07/09 PHP
php实现refresh刷新页面批量导入数据的方法
2014/12/23 PHP
golang与php实现计算两个经纬度之间距离的方法
2016/07/22 PHP
javascript动态加载二
2012/08/22 Javascript
使用ImageMagick进行图片缩放、合成与裁剪(js+python)
2013/09/16 Javascript
浅谈jquery回调函数callback的使用
2015/01/30 Javascript
jQuery+Ajax+PHP+Mysql实现分页显示数据实例讲解
2015/09/27 Javascript
js实现延时加载Flash的方法
2015/11/26 Javascript
jQuery实现的两种简单弹窗效果示例
2018/04/18 jQuery
详解vue-loader在项目中是如何配置的
2018/06/04 Javascript
vue实现重置表单信息为空的方法
2018/09/29 Javascript
angularJs使用ng-repeat遍历后选中某一个的方法
2018/09/30 Javascript
vue 基于element-ui 分页组件封装的实例代码
2018/12/10 Javascript
JS多个表单数据提交下的serialize()应用实例分析
2019/08/27 Javascript
JS apply用法总结和使用场景实例分析
2020/03/14 Javascript
[01:51]2018年度CS GO最具人气外援-完美盛典
2018/12/16 DOTA
[29:16]完美世界DOTA2联赛决赛日 Inki vs LBZS 第三场 11.08
2020/11/10 DOTA
Python学习笔记之open()函数打开文件路径报错问题
2018/04/28 Python
利用pandas读取中文数据集的方法
2018/07/25 Python
对IPython交互模式下的退出方法详解
2019/02/16 Python
详解python算法之冒泡排序
2019/03/05 Python
Python中turtle库的使用实例
2019/09/09 Python
django框架F&Q 聚合与分组操作示例
2019/12/12 Python
Python实现疫情通定时自动填写功能(附代码)
2020/05/27 Python
python如何安装下载后的模块
2020/07/03 Python
python一些性能分析的技巧
2020/08/30 Python
HTML5引入的新数组TypedArray介绍
2012/12/24 HTML / CSS
班队活动设计方案
2014/01/30 职场文书
食品安全检查制度
2014/02/03 职场文书
保护环境的标语
2014/06/09 职场文书
学校宣传标语
2014/06/18 职场文书
测绘工程专业求职信
2014/07/15 职场文书
高校教师个人工作总结2014
2014/12/17 职场文书
2015年乡镇信访工作总结
2015/04/07 职场文书