基于Python正确读取资源文件


Posted in Python onSeptember 14, 2020

我们知道,当你把一个资源文件和一个.py文件放在一起的时候,你可以直接在这个.py文件中,使用文件名读取它。例如:

with open('test.txt') as f: 
  content = f.read() 
print('文件中的内容为:', content)

运行效果如下图所示:

基于Python正确读取资源文件

但请注意,这里我是直接运行的read.py这个文件。如果资源文件是存放在一个包(package)里面,然后我们在外面调用这个包里面的.py文件会怎么样呢?我们试一试:

基于Python正确读取资源文件

可以看到,现在Python 已经找不到这个文件了。这是因为,我们的入口程序在 ~/get_title文件夹中,而test.txt文件在~/get_title/util文件夹中。因为我们运行的是main.py,所以 Python 会在~/get_title文件夹里面寻找test.txt,自然就找不到了。

如果是引用包里面的其他模块,可以使用相对路径。例如引用同一个包里面名叫sql_util.py里面的conn对象,我们可以直接写为from .sql_util import conn。但是资源文件不能使用相对路径来读取,如下图所示:

基于Python正确读取资源文件

有一个笨办法,就是获取当前正在运行的这一行代码所在的文件夹,然后拼出资源文件的完整路径。修改 read.py 文件:

import os 
def read_file(): 
  current_folder = os.path.dirname(__file__) 
  resource_path = os.path.join(current_folder, 'test.txt') 
  with open(resource_path) as f: 
    content = f.read() 
  print('文件中的内容为:', content)

运行效果如下图所示:

基于Python正确读取资源文件

但这样写稍显麻烦。

如果你的 Python 版本不低于3.7,那么你可以使用importlib.resources来快速读取资源文件:

from importlib import resources 
with resources.open_text('包名', '资源路径') as f: 
  content = f.read()

运行效果如下图所示:

基于Python正确读取资源文件

如果你读取的不是文本文件,那么你可以把resources.open_text改成resources.open_binary,从而读取二进制文件。

但需要注意的是,资源文件必须放在包的根目录。这样才能正确读取。如果资源文件在包内部的子目录中,importlib.resources是不能直接读取的。

例如我们的包为util,里面有一个文件夹叫做deep_folder,资源文件test.txt放在deep_folder中,此时,我们如果要读取这个资源文件,就必须把在deep_folder文件夹中创建一个init.py,把它也变成一个包。然后修改read.py的代码:

from importlib import resources 
from . import deep_folder 

def read_file(): 
  with resources.open_text(deep_folder, 'test.txt') as f: 
    content = f.read() 
  print('文件中的内容为:', content)

把deep_folder作为一个 module 导入,然后把这个 module 作为resources.open_text的第一个参数。这样才能正确读取,如下图所示:

基于Python正确读取资源文件

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

Python 相关文章推荐
python根据出生日期获得年龄的方法
Mar 31 Python
Python使用Tkinter实现机器人走迷宫
Jan 22 Python
详解python中的线程
Feb 10 Python
mac下给python3安装requests库和scrapy库的实例
Jun 13 Python
python对list中的每个元素进行某种操作的方法
Jun 29 Python
使用 Visual Studio Code(VSCode)搭建简单的Python+Django开发环境的方法步骤
Dec 17 Python
详解Python的数据库操作(pymysql)
Apr 04 Python
解决Tensorflow sess.run导致的内存溢出问题
Feb 05 Python
关于django python manage.py startapp 应用名出错异常原因解析
Dec 15 Python
python删除csv文件的行列
Apr 06 Python
解决Tkinter中button按钮未按却主动执行command函数的问题
May 23 Python
Python作用域和名称空间的详细介绍
Apr 13 Python
Django框架安装及项目创建过程解析
Sep 14 #Python
通过代码实例了解Python sys模块
Sep 14 #Python
基于python实现简单C/S模式代码实例
Sep 14 #Python
Elasticsearch py客户端库安装及使用方法解析
Sep 14 #Python
基于python实现简单网页服务器代码实例
Sep 14 #Python
用python绘制樱花树
Oct 09 #Python
Python logging日志库空间不足问题解决
Sep 14 #Python
You might like
PHP缩略图等比例无损压缩,可填充空白区域补充色
2011/06/10 PHP
PHP5.3与5.5废弃与过期函数整理汇总
2014/07/10 PHP
浅谈PHP中JSON数据操作
2015/07/01 PHP
全面解读PHP的人气开发框架Laravel
2015/10/15 PHP
PHP实现递归无限级分类
2015/10/22 PHP
thinkPHP中配置的读取与C方法详解
2016/12/05 PHP
关于laravel 数据库迁移中integer类型是无法指定长度的问题
2019/10/09 PHP
解读JavaScript中 For, While与递归的用法
2013/05/07 Javascript
jquery简单的拖动效果实现原理及示例
2013/07/26 Javascript
JS实现OCX控件的事件响应示例
2014/09/17 Javascript
JavaScript实现文本框中默认显示背景图片在获得焦点后消失的方法
2015/07/01 Javascript
javascript实现鼠标点击页面 移动DIV
2016/12/02 Javascript
浅谈ajax在jquery中的请求和servlet中的响应
2018/01/22 jQuery
jQuery实现的点击图片居中放大缩小功能示例
2019/01/16 jQuery
jQuery.parseJSON()函数详解
2019/02/28 jQuery
如何在JavaScript中优雅的提取循环内数据详解
2019/03/04 Javascript
基于vue框架手写一个notify插件实现通知功能的方法
2019/03/31 Javascript
微信小程序实现二维码签到考勤系统
2020/01/16 Javascript
原生js实现自定义难度的扫雷游戏
2021/01/22 Javascript
[00:32]10月24、25日 辉夜杯外卡赛附加赛开赛!
2015/10/23 DOTA
[01:05:59]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.22
2019/09/05 DOTA
python 布尔操作实现代码
2013/03/23 Python
详解Python中with语句的用法
2015/04/15 Python
python移位运算的实现
2019/07/15 Python
关于python中plt.hist参数的使用详解
2019/11/28 Python
解决jupyter运行pyqt代码内核重启的问题
2020/04/16 Python
Python定义一个Actor任务
2020/07/29 Python
CSS3实现曲线阴影和翘边阴影
2016/05/03 HTML / CSS
利用简洁的图片预加载组件提升html5移动页面的用户体验
2016/03/11 HTML / CSS
美国领先的家庭健康检测试剂盒提供商:LetsGetChecked
2019/03/18 全球购物
含精油的天然有机化妆品:Indemne
2019/08/27 全球购物
普通员工辞职信
2014/01/17 职场文书
业绩考核岗位职责
2014/02/01 职场文书
科级干部群众路线教育实践活动对照检查材料思想汇报
2014/09/20 职场文书
2014收银员工作总结范文
2014/12/16 职场文书
检讨书怎么写?
2019/06/21 职场文书