基于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 算法 排序实现快速排序
Jun 05 Python
python根据出生日期获得年龄的方法
Mar 31 Python
Windows下的Python 3.6.1的下载与安装图文详解(适合32位和64位)
Feb 21 Python
Django 实现下载文件功能的示例
Mar 06 Python
python 剪切移动文件的实现代码
Aug 02 Python
python 切换root 执行命令的方法
Jan 19 Python
pyqt5实现绘制ui,列表窗口,滚动窗口显示图片的方法
Jun 20 Python
使用Python做垃圾分类的原理及实例代码附源码
Jul 02 Python
django项目登录中使用图片验证码的实现方法
Aug 15 Python
tensorflow 分类损失函数使用小记
Feb 18 Python
浅谈python多线程和多线程变量共享问题介绍
Apr 17 Python
win7上tensorflow2.2.0安装成功 引用DLL load failed时找不到指定模块 tensorflow has no attribute xxx 解决方法
May 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
Linux下安装PHP MSSQL扩展教程
2014/10/24 PHP
php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法
2015/10/20 PHP
php实现PDO中捕获SQL语句错误的方法
2017/02/16 PHP
PHP编程获取音频文件时长的方法【基于getid3类】
2017/04/20 PHP
PHP实现的基于单向链表解决约瑟夫环问题示例
2017/09/30 PHP
数据结构之利用PHP实现二分搜索树
2020/10/25 PHP
javascript import css实例代码
2008/07/18 Javascript
javascript EXCEL 操作类代码
2009/07/30 Javascript
javascript 限制输入脚本大全
2009/11/03 Javascript
非阻塞动态加载javascript广告实现代码
2010/11/17 Javascript
运行Node.js的IIS扩展iisnode安装配置笔记
2015/03/02 Javascript
js计算德州扑克牌面值的方法
2015/03/04 Javascript
JavaScript动态添加列的方法
2015/03/25 Javascript
深入理解JS正则表达式---分组
2016/07/18 Javascript
JS基于正则截取替换特定字符之间字符串操作示例
2017/02/03 Javascript
BootStrap表单验证 FormValidation 调整反馈图标位置的实例代码
2017/05/17 Javascript
vue.js获得当前元素的文字信息方法
2018/03/09 Javascript
vue2.0+koa2+mongodb实现注册登录
2018/04/10 Javascript
微信小程序如何实现精确的日期时间选择器
2020/01/21 Javascript
Vue中this.$nextTick的作用及用法
2020/02/04 Javascript
NodeJS多种创建WebSocket监听的方式(三种)
2020/06/04 NodeJs
[05:34]2014DOTA2国际邀请赛中国区预选赛精彩TOPPLAY第二弹
2014/06/25 DOTA
[00:27]DOTA2战队VP、Secret贺新春
2018/02/11 DOTA
Python for Informatics 第11章之正则表达式(二)
2016/04/21 Python
django反向解析URL和URL命名空间的方法
2018/06/05 Python
python多线程并发及测试框架案例
2019/10/15 Python
python如何爬取网页中的文字
2020/07/28 Python
python画图时设置分辨率和画布大小的实现(plt.figure())
2021/01/08 Python
HTML5印章绘制电子签章图片(中文英文椭圆章、中文英文椭圆印章)
2019/06/03 HTML / CSS
美国最大的在线生存商店:Survival Frog
2020/12/13 全球购物
2014年最新学习全国两会精神心得
2014/03/17 职场文书
食品安全责任书
2014/04/15 职场文书
2014年母亲节演讲稿范文
2014/05/07 职场文书
"9.18"国耻日演讲稿范文
2014/09/14 职场文书
省委召开党的群众路线教育实践活动总结大会报告
2014/10/21 职场文书
通知函格式范文
2015/04/27 职场文书