基于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计算程序开始到程序结束的运行时间和程序运行的CPU时间
Nov 28 Python
全面解读Python Web开发框架Django
Jun 30 Python
用Python实现斐波那契(Fibonacci)函数
Mar 25 Python
分享Python开发中要注意的十个小贴士
Aug 30 Python
[原创]windows下Anaconda的安装与配置正解(Anaconda入门教程)
Apr 05 Python
NumPy 数学函数及代数运算的实现代码
Jul 18 Python
学习python可以干什么
Feb 26 Python
Django对models里的objects的使用详解
Aug 17 Python
使用Python制作一个打字训练小工具
Oct 01 Python
基于python3抓取pinpoint应用信息入库
Jan 08 Python
计算pytorch标准化(Normalize)所需要数据集的均值和方差实例
Jan 15 Python
通过代码实例解析Pytest运行流程
Aug 20 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
浅谈web上存漏洞及原理分析、防范方法(文件名检测漏洞)
2013/06/29 PHP
PHP函数nl2br()与自定义函数nl2p()换行用法分析
2016/04/02 PHP
laravel + vue实现的数据统计绘图(今天、7天、30天数据)
2018/07/31 PHP
Gambit vs ForZe BO3 第三场 2.13
2021/03/10 DOTA
js 对联广告、漂浮广告封装类(IE,FF,Opera,Safari,Chrome
2009/11/26 Javascript
js+数组实现网页上显示时间/星期几的实用方法
2013/01/18 Javascript
jQuery事件绑定.on()简要概述及应用
2013/02/07 Javascript
JavaScript事件学习小结(三)js事件对象
2016/06/09 Javascript
JavaScript中localStorage对象存储方式实例分析
2017/01/12 Javascript
js实现漫天星星效果
2017/01/19 Javascript
bootstrap table之通用方法( 时间控件,导出,动态下拉框, 表单验证 ,选中与获取信息)代码分享
2017/01/24 Javascript
jQuery制作input提示内容(兼容IE8以上)
2017/07/05 jQuery
解决vue select当前value没有更新到vue对象属性的问题
2018/08/30 Javascript
qrcode生成二维码微信长按无法识别问题的解决
2019/04/04 Javascript
layui.use模块外部使用其内部定义的js封装函数方法
2019/09/16 Javascript
Vue中使用Echarts仪表盘展示实时数据的实现
2020/11/01 Javascript
[03:16]DOTA2完美大师赛小组赛精彩集锦
2017/11/22 DOTA
使用Python脚本将绝对url替换为相对url的教程
2015/04/24 Python
在Python的while循环中使用else以及循环嵌套的用法
2015/10/14 Python
Python打印“菱形”星号代码方法
2018/02/05 Python
python使用opencv按一定间隔截取视频帧
2018/03/06 Python
python中类的属性和方法介绍
2018/11/27 Python
selenium+python实现自动登陆QQ邮箱并发送邮件功能
2019/12/13 Python
Python实现鼠标自动在屏幕上随机移动功能
2020/03/14 Python
利用css3实现的简单的鼠标悬停按钮
2014/11/04 HTML / CSS
8款使用 CSS3 实现超炫的 Loading(加载)的动画效果
2015/03/17 HTML / CSS
洲际酒店集团英国官网:IHG英国
2019/07/10 全球购物
YBF Beauty官网:美丽挚友,美国知名彩妆品牌
2020/11/22 全球购物
财务会计专业毕业生自荐信
2013/10/19 职场文书
商场拾金不昧表扬信
2014/01/13 职场文书
篮球比赛口号
2014/06/10 职场文书
社区志愿者活动方案
2014/08/18 职场文书
2014群众路线学习笔记
2014/11/06 职场文书
2016年全国爱眼日宣传教育活动总结
2016/04/05 职场文书
python如何利用traceback获取详细的异常信息
2021/06/05 Python
分享一些Java的常用工具
2021/06/11 Java/Android