基于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计算对角线有理函数插值的方法
May 07 Python
在Windows系统上搭建Nginx+Python+MySQL环境的教程
Dec 25 Python
Python中使用pypdf2合并、分割、加密pdf文件的代码详解
May 21 Python
使用PyQt4 设置TextEdit背景的方法
Jun 14 Python
PyQt5 实现字体大小自适应分辨率的方法
Jun 18 Python
在linux下实现 python 监控usb设备信号
Jul 03 Python
如何更改 pandas dataframe 中两列的位置
Dec 27 Python
IDLE下Python文件编辑和运行操作
Apr 25 Python
哪些是python中web开发框架
Jun 17 Python
python使用QQ邮箱实现自动发送邮件
Jun 22 Python
如何用python写个模板引擎
Jan 14 Python
Python如何telnet到网络设备
Feb 18 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 mssql 时间格式问题
2009/01/13 PHP
PHP获取指定日期是星期几的实现方法
2016/11/30 PHP
Yii使用EasyWechat实现小程序获取用户的openID的方法
2020/04/29 PHP
JavaScript中null与undefined分析
2009/07/25 Javascript
js removeChild 障眼法 可能出现的错误
2009/10/06 Javascript
javascript中使用css需要注意的地方小结
2010/09/01 Javascript
改写一个简单的菜单 弹性大小
2010/12/02 Javascript
jQuery实战之品牌展示列表效果
2011/04/10 Javascript
JS.elementGetStyle(element, style)应用示例
2013/09/24 Javascript
JS的location.href跳出框架打开新页面的方法
2014/09/04 Javascript
解决JS请求服务器gbk文件乱码的问题
2015/10/16 Javascript
Bootstrap基本插件学习笔记之Popover提示框(19)
2016/12/08 Javascript
jQuery实现花式轮播之圣诞节礼物传送效果
2016/12/25 Javascript
详解React native全局变量的使用(跨组件的通信)
2017/09/07 Javascript
jquery自定义显示消息数量
2017/12/19 jQuery
JQuery常见节点操作实例分析
2019/05/15 jQuery
vue 组件中使用 transition 和 transition-group实现过渡动画
2019/07/09 Javascript
JS加载解析Markdown文档过程详解
2020/05/19 Javascript
vue Element左侧无限级菜单实现
2020/06/10 Javascript
Electron 打包问题:electron-builder 下载各种依赖出错(推荐)
2020/07/09 Javascript
vue中全局路由守卫中替代this操作(this.$store/this.$vux)
2020/07/24 Javascript
[45:10]NB vs Liquid Supermajor小组赛 A组胜者组决赛 BO3 第二场 6.2
2018/06/04 DOTA
Python读取指定目录下指定后缀文件并保存为docx
2017/04/23 Python
python中selenium操作下拉滚动条的几种方法汇总
2019/07/14 Python
Python3+PyInstall+Sciter解决报错缺少dll、html等文件问题
2019/07/15 Python
Django集成celery发送异步邮件实例
2019/12/17 Python
PyCharm第一次安装及使用教程
2020/01/08 Python
从python读取sql的实例方法
2020/07/21 Python
纯CSS3实现图片无间断轮播效果
2016/08/25 HTML / CSS
纬创Java面试题笔试题
2014/10/02 面试题
员工培训心得体会
2013/12/30 职场文书
装修五一活动策划案
2014/01/23 职场文书
工地标语大全
2014/06/18 职场文书
党员干部反四风对照检查材料思想汇报
2014/09/14 职场文书
升学宴家长答谢词
2015/09/29 职场文书
go goroutine 怎样进行错误处理
2021/07/16 Golang