基于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基于回溯法子集树模板解决取物搭配问题实例
Sep 02 Python
Python使用三种方法实现PCA算法
Dec 12 Python
Python数据持久化shelve模块用法分析
Jun 29 Python
Python实现两个list求交集,并集,差集的方法示例
Aug 02 Python
介绍一款python类型检查工具pyright(推荐)
Jul 03 Python
pip安装python库的方法总结
Aug 02 Python
python 提取文件指定列的方法示例
Aug 07 Python
Pytorch卷积层手动初始化权值的实例
Aug 17 Python
python tkinter canvas使用实例
Nov 04 Python
如何修复使用 Python ORM 工具 SQLAlchemy 时的常见陷阱
Nov 19 Python
用python写一个带有gui界面的密码生成器
Nov 06 Python
pytorch Dataset,DataLoader产生自定义的训练数据案例
Mar 03 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中Y2K38的漏洞解决方法实例分析
2014/09/22 PHP
JQuery实现的图文自动轮播效果插件
2015/06/19 Javascript
jQuery基于扩展实现的倒计时效果
2016/05/14 Javascript
Bootstrap表单布局样式代码
2016/05/31 Javascript
谈谈target=_new和_blank的不同之处
2016/10/25 Javascript
使用 jQuery.ajax 上传带文件的表单遇到的问题
2016/10/31 Javascript
Node.js中如何合并两个复杂对象详解
2016/12/31 Javascript
js中开关变量使用实例
2017/02/24 Javascript
详解VueJs前后端分离跨域问题
2017/05/24 Javascript
使用JavaScript实现链表的数据结构的代码
2017/08/02 Javascript
浅谈vue-cli 3.0.x 初体验
2018/04/11 Javascript
Vue2.2.0+新特性整理及注意事项
2018/08/22 Javascript
js时间戳转yyyy-MM-dd HH-mm-ss工具类详解
2019/04/30 Javascript
JS实现的简单tab切换功能完整示例
2019/06/20 Javascript
浅谈Three.js截图并下载的大坑
2019/11/01 Javascript
vue element 中的table动态渲染实现(动态表头)
2019/11/21 Javascript
[43:26]完美世界DOTA2联赛PWL S2 Forest vs Rebirth 第二场 11.20
2020/11/23 DOTA
python模块之subprocess模块级方法的使用
2019/03/26 Python
Django分页功能的实现代码详解
2019/07/29 Python
python实现逆滤波与维纳滤波示例
2020/02/26 Python
jupyter notebook 多环境conda kernel配置方式
2020/04/10 Python
CSS3 filter(滤镜)实现网页灰色或者黑色模式的示例代码
2021/02/24 HTML / CSS
HTML5中的网络存储实现方式
2020/04/28 HTML / CSS
Tarte Cosmetics官网:美国最受欢迎的化妆品公司之一
2017/08/24 全球购物
餐饮业的创业计划书范文
2013/12/26 职场文书
2014年乡镇植树节活动方案
2014/02/28 职场文书
餐厅筹备计划书
2014/04/25 职场文书
好书伴我成长演讲稿
2014/05/14 职场文书
小学优秀班干部事迹材料
2014/05/25 职场文书
财务检查整改报告
2014/11/06 职场文书
2014年社区宣传工作总结
2014/12/02 职场文书
公司董事任命书
2015/09/21 职场文书
蓝天保卫战收官在即 :15行业将开展环保分级评价
2019/07/19 职场文书
在 HTML 页面中使用 React的场景分析
2022/01/18 Javascript
Python IO文件管理的具体使用
2022/03/20 Python
利用Python脚本写端口扫描器socket,python-nmap
2022/07/23 Python