Python 解决相对路径问题:"No such file or directory"


Posted in Python onJune 05, 2020

如果你取相对路径不是在主文件里,可能就会有相对路径问题:"No such file or directory"。

因为 python 的相对路径,相对的都是主文件。

如下目录结构:

| -- main.py
   | -- conf.py
   | -- start.png
| -- config.txt

main.py 是主文件。

conf.py 里引用 config.txt 用相对路径。

如果用 . 或 … 相对的是 main.py,所以用 "./config.txt",相对于 main.py 是同一个目录下。

.指当前文件所在的文件夹,… 指当前文件的上一级目录。

补充知识:解决python模块调用时代码中使用相对路径访问的文件,提示文件不存在的问题

问题分析:

在编码过程中使用相对路径使代码的稳定性更好,即使项目目录发生变更,只要文件相对路径不变,代码依然可以稳定运行。但是在python代码中使用相对路径时会存在以下问题,示例代码结构如下:

Python 解决相对路径问题:"No such file or directory"

其中test包中包含两个文件first.py和user_info.txt,first.py代码中只有一个函数read_file,用于读取user_info.txt文件第一行的内容,并打印结果,读取文件使用相对路径,代码如下:

import os
print("当前路径 -> %s" %os.getcwd())
def read_file() :
  with open("user_info.txt" , encoding = 'utf-8') as f_obj :
    content = f_obj.readline()
    print("文件内容 -> %s" %content)
 
if __name__ == '__main__' :
  read_file()

first.py程序代码执行结果如下:

当前路径 -> E:\程序\python代码\PythonDataAnalysis\Demo\test

文件内容 -> hello python !!!

与test在同一目录下存在一个second.py文件,在这个文件中调用first.py文件中的read_file方法读取user_info.txt文件,代码如下:

from test import first

first.read_file()

second.py程序执行结果如下:

当前路径 -> E:\程序\python代码\PythonDataAnalysis\Demo

File "E:/程序/python代码/PythonDataAnalysis/Demo/second.py", line 8, in <module>

first.read_file()

File "E:\程序\python代码\PythonDataAnalysis\Demo\test\first.py", line 10, in read_file

with open("user_info.txt" , encoding = 'utf-8') as f_obj :

FileNotFoundError: [Errno 2] No such fileor directory: 'user_info.txt'

以上信息提示user_info.txt 文件不存在,查看os.getcwd() 函数输出的当前路径会发现,当前路径是 XXX/Demo,而不是上一次单独执行first.py 文件时的 XXX/Demo/test了,所以程序报错文件不存在的根本原因是因为当前路径变了,导致代码中的由相对路径构成的绝对路径发生了变化。

解决方法:

对于这种问题,只需要在使用相对路径进行文件访问的模块中加入以下代码即可(加粗内容),修改后的first.py代码如下:

import os
print("当前路径 -> %s" %os.getcwd())
current_path = os.path.dirname(__file__)
def read_file() :
  with open(current_path + "/user_info.txt" , encoding = 'utf-8') as f_obj :
    content = f_obj.readline()
    print("文件内容 -> %s" %content)
 
if __name__ == '__main__' :
  read_file()

first.py 程序执行结果如下:

当前路径 -> E:\程序\python代码\PythonDataAnalysis\Demo\test

current_path -> E:/程序/python代码/PythonDataAnalysis/Demo/test

文件内容 -> hello python !!!

second.py代码不变,second.py代码执行结果如下:

当前路径 -> E:\程序\python代码\PythonDataAnalysis\Demo

current_path -> E:\程序\python代码\PythonDataAnalysis\Demo\test

文件内容 -> hello python !!!

由以上执行结果可以发现,虽然first.py和second.py代码执行时os.getcwd()函数的输出结果还是不一致,但是current_path = os.path.dirname(__file__)

代码得到的current_path路径是相同的,current_path就是first.py文件所处的路径,然后再由current_path 和user_info.txt 组成的文件绝对路径则是固定的,这样就可以确保在进行模块导入时,模块中使用相对路径进行访问的文件不会出错。

以上这篇Python 解决相对路径问题:"No such file or directory"就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python写的一个文本编辑器
Jan 23 Python
实例讲解python函数式编程
Jun 09 Python
Python中super关键字用法实例分析
May 28 Python
浅谈Python数据类型判断及列表脚本操作
Nov 04 Python
Python文件的读写和异常代码示例
Oct 31 Python
浅谈Django学习migrate和makemigrations的差别
Jan 18 Python
对python pandas 画移动平均线的方法详解
Nov 28 Python
详解Python 函数如何重载?
Apr 23 Python
python中 * 的用法详解
Jul 10 Python
python列表推导式入门学习解析
Dec 02 Python
Python常用编译器原理及特点解析
Mar 23 Python
python使用matplotlib绘制折线图的示例代码
Sep 22 Python
opencv之颜色过滤只留下图片中的红色区域操作
Jun 05 #Python
Python参数传递及收集机制原理解析
Jun 05 #Python
python如何进行矩阵运算
Jun 05 #Python
Opencv求取连通区域重心实例
Jun 04 #Python
Python中zip函数如何使用
Jun 04 #Python
Python中有几个关键字
Jun 04 #Python
Python如何转换字符串大小写
Jun 04 #Python
You might like
杏林同学录(四)
2006/10/09 PHP
Yii框架中 find findAll 查找出制定的字段的方法对比
2014/09/10 PHP
laravel5创建service provider和facade的方法详解
2016/07/26 PHP
PHP封装的XML简单操作类完整实例
2017/11/13 PHP
Laravel框架模板加载,分配变量及简单路由功能示例
2018/06/11 PHP
PHP defined()函数的使用图文详解
2019/07/20 PHP
laravel 自定义常量的两种方案
2019/10/14 PHP
基于jQuery的弹出框插件
2012/03/18 Javascript
document.write()及其输出内容的样式、位置控制
2013/08/12 Javascript
使用纯javascript实现放大镜效果
2015/03/18 Javascript
JS实现为表格动态添加标题的方法
2015/03/31 Javascript
jQuery中$.each()函数的用法引申实例
2016/05/12 Javascript
js操作数据库实现注册和登陆的简单实例
2016/05/26 Javascript
AngularJS中指令的四种基本形式实例分析
2016/11/22 Javascript
jquery操作ID带有变量的节点实例
2016/12/07 Javascript
详解vue-router基本使用
2017/04/18 Javascript
JavaScript使用atan2来绘制箭头和曲线的实例
2017/09/14 Javascript
jq源码解析之绑在$,jQuery上面的方法(实例讲解)
2017/10/13 jQuery
再谈Angular4 脏值检测(性能优化)
2018/04/23 Javascript
vue.js编译时给生成的文件增加版本号
2018/09/17 Javascript
layui的面包屑或者表单不显示的解决方法
2019/09/05 Javascript
JavaScript中如何对多维数组(矩阵)去重的实现
2019/12/04 Javascript
Python 列表list使用介绍
2014/11/30 Python
利用python批量修改word文件名的方法示例
2017/10/17 Python
python 读入多行数据的实例
2018/04/19 Python
python线程池threadpool实现篇
2018/04/27 Python
python3+requests接口自动化session操作方法
2018/10/13 Python
详解Python给照片换底色(蓝底换红底)
2019/03/22 Python
python 多线程对post请求服务器测试并发的方法
2019/06/13 Python
python orm 框架中sqlalchemy用法实例详解
2020/02/02 Python
HTML5 input placeholder 颜色修改示例
2014/05/30 HTML / CSS
Looking4Parking美国:全球排名第一的机场停车比较品牌
2019/08/26 全球购物
英文请假条
2014/04/11 职场文书
结对共建协议书
2014/08/20 职场文书
2016年大学光棍节活动总结
2016/04/05 职场文书
分析Python感知线程状态的解决方案之Event与信号量
2021/06/16 Python