基于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 03 Python
Python通过matplotlib画双层饼图及环形图简单示例
Dec 15 Python
python机器学习实战之K均值聚类
Dec 20 Python
Python http接口自动化测试框架实现方法示例
Dec 06 Python
python 输出所有大小写字母的方法
Jan 02 Python
Python之使用adb shell命令启动应用的方法详解
Jan 07 Python
Pytorch实现基于CharRNN的文本分类与生成示例
Jan 08 Python
From CSV to SQLite3 by python 导入csv到sqlite实例
Feb 14 Python
jupyter notebook读取/导出文件/图片实例
Apr 16 Python
Python HTMLTestRunner测试报告view按钮失效解决方案
May 25 Python
python OpenCV学习笔记
Mar 31 Python
Python趣味挑战之教你用pygame画进度条
May 31 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写的简易聊天室代码
2011/06/04 PHP
php实现在多维数组中查找特定value的方法
2015/07/29 PHP
php实现图片按比例截取的方法
2017/02/06 PHP
PHP多个图片压缩成ZIP的方法
2020/08/18 PHP
PHP使用PDO创建MySQL数据库、表及插入多条数据操作示例
2019/05/30 PHP
用js实现的页面关键字密度查询代码
2007/12/27 Javascript
JS 继承实例分析
2008/11/04 Javascript
jQuery.validate 常用方法及需要注意的问题
2013/03/20 Javascript
JS实现很酷的EMAIL地址添加功能实例
2015/02/28 Javascript
JavaScript获得页面base标签中url的方法
2015/04/03 Javascript
简介JavaScript中getUTCMonth()方法的使用
2015/06/10 Javascript
JavaScript中的parse()方法使用简介
2015/06/12 Javascript
JavaScript函数的调用以及参数传递
2015/10/21 Javascript
JavaScript高级程序设计(第三版)学习笔记6、7章
2016/03/11 Javascript
vue.js移动端app实战1:初始配置详解
2017/07/24 Javascript
Vue异步加载about组件
2017/10/31 Javascript
nodejs项目windows下开机自启动的方法
2017/11/22 NodeJs
解决vue数组中对象属性变化页面不渲染问题
2018/08/09 Javascript
微信小程序自定义组件封装及父子间组件传值的方法
2018/08/28 Javascript
Javascript中Math.max和Math.max.apply的区别和用法详解
2020/08/24 Javascript
vue调用微信JSDK 扫一扫,相册等需要注意的事项
2021/01/03 Vue.js
跟老齐学Python之让人欢喜让人忧的迭代
2014/10/02 Python
Python3中使用urllib的方法详解(header,代理,超时,认证,异常处理)
2016/09/21 Python
Python内置函数——__import__ 的使用方法
2017/11/24 Python
python将txt文件读取为字典的示例
2018/12/22 Python
python 画二维、三维点之间的线段实现方法
2019/07/07 Python
如何安装2019Pycharm最新版本(详细教程)
2019/09/26 Python
基于python生成英文版词云图代码实例
2020/05/16 Python
英国领先的瓷砖专家:Walls and Floors
2018/04/27 全球购物
全球性的在线商店:Vogca
2019/05/10 全球购物
加拿大户外探险购物网站:SAIL
2020/06/27 全球购物
申报职称专业技术个人的自我评价
2013/12/12 职场文书
数控技术学生的自我评价
2014/02/15 职场文书
企业宣传口号
2014/06/12 职场文书
大学生创业事迹材料
2014/12/30 职场文书
Nginx图片服务器配置之后图片访问404的问题解决
2022/03/21 Servers