基于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实现备份目录的方法
Aug 03 Python
python调用fortran模块
Apr 08 Python
Python 出现错误TypeError: ‘NoneType’ object is not iterable解决办法
Jan 12 Python
详谈Python高阶函数与函数装饰器(推荐)
Sep 30 Python
python编写朴素贝叶斯用于文本分类
Dec 21 Python
tensorflow 用矩阵运算替换for循环 用tf.tile而不写for的方法
Jul 27 Python
python使用Turtle库绘制动态钟表
Nov 19 Python
利用Python实现原创工具的Logo与Help
Dec 03 Python
python实现扑克牌交互式界面发牌程序
Apr 22 Python
python3 sleep 延时秒 毫秒实例
May 04 Python
Python astype(np.float)函数使用方法解析
Jun 08 Python
python 标准库原理与用法详解之os.path篇
Oct 24 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 Class&Object -- 解析PHP实现二叉树
2013/06/25 PHP
PHP异常处理浅析
2015/05/12 PHP
PHP面向对象详解(三)
2015/12/07 PHP
phpStorm2020 注册码
2020/09/17 PHP
JavaScript Timer实现代码
2010/02/17 Javascript
善用事件代理,警惕闭包的性能陷阱。
2011/01/20 Javascript
jQuery 过滤not()与filter()实例代码
2012/05/10 Javascript
ExtJs中gridpanel分组后组名排序实例代码
2013/12/02 Javascript
使用JS取得焦点(focus)元素代码
2014/03/22 Javascript
jquery中checkbox全选失效的解决方法
2014/12/26 Javascript
javascript中checkbox使用方法简单实例演示
2015/11/17 Javascript
jQuery限制图片大小的方法
2016/05/25 Javascript
类似于QQ的右滑删除效果的实现方法
2016/10/16 Javascript
详解小程序原生使用ES7 async/await语法
2018/08/06 Javascript
jQuery利用FormData上传文件实现批量上传
2018/12/04 jQuery
20道JS原理题助你面试一臂之力(必看)
2019/07/22 Javascript
python实现百度关键词排名查询
2014/03/30 Python
python 按照固定长度分割字符串的方法小结
2018/04/30 Python
Python画柱状统计图操作示例【基于matplotlib库】
2018/07/04 Python
详解Pandas之容易让人混淆的行选择和列选择
2019/07/10 Python
Flask框架模板渲染操作简单示例
2019/07/31 Python
Python字符串及文本模式方法详解
2020/09/10 Python
协程Python 中实现多任务耗资源最小的方式
2020/10/19 Python
HTML5逐步分析实现拖放功能的方法
2020/09/30 HTML / CSS
预订奥兰多和佛罗里达州公园门票:FloridaTix
2018/01/03 全球购物
英国女性运动服品牌:Sweaty Betty
2018/11/08 全球购物
俄罗斯美容和健康网上商店:Созвездие Красоты
2019/07/23 全球购物
DBA的职责都有哪些
2012/05/16 面试题
舞蹈教育学专业推荐信
2013/11/27 职场文书
工程业务员岗位职责
2013/12/31 职场文书
高中生操行评语
2014/04/25 职场文书
2014年“四风”问题个人整改措施
2014/09/17 职场文书
群众路线剖析材料怎么写
2014/10/09 职场文书
企业与个人合作经营协议书
2014/11/01 职场文书
评估“风险”创业计划的几大要点
2019/08/12 职场文书
Python requests用法和django后台处理详解
2022/03/19 Python