基于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 相关文章推荐
videocapture库制作python视频高速传输程序
Dec 23 Python
sqlalchemy对象转dict的示例
Apr 22 Python
python实现将英文单词表示的数字转换成阿拉伯数字的方法
Jul 02 Python
学习python之编写简单乘法口诀表实现代码
Feb 27 Python
python实现给微信公众号发送消息的方法
Jun 30 Python
python实现数独游戏 java简单实现数独游戏
Mar 30 Python
python输出100以内的质数与合数实例代码
Jul 08 Python
Python检查和同步本地时间(北京时间)的实现方法
Dec 03 Python
python字符串切割:str.split()与re.split()的对比分析
Jul 16 Python
Python 实现opencv所使用的图片格式与 base64 转换
Jan 09 Python
python Selenium 库的使用技巧
Oct 16 Python
Python利器openpyxl之操作excel表格
Apr 17 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后退一页表单内容保存实现方法
2012/06/17 PHP
非常重要的php正则表达式详解
2016/01/04 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
2020/02/22 PHP
javascript prototype,executing,context,closure
2008/12/24 Javascript
理解Javascript_05_原型继承原理
2010/10/13 Javascript
Web前端设计模式  制作漂亮的弹出层
2010/10/29 Javascript
js实现带缓冲效果的仿QQ面板折叠菜单代码
2015/09/06 Javascript
基于jquery插件编写countdown计时器
2016/06/12 Javascript
关于JSON.parse(),JSON.stringify(),jQuery.parseJSON()的用法
2016/06/30 Javascript
基于vue实现swipe轮播组件实例代码
2017/05/24 Javascript
微信小程序引用公共js里的方法的实例详解
2017/08/17 Javascript
node.js实现微信JS-API封装接口的示例代码
2017/09/06 Javascript
node.js学习笔记之koa框架和简单爬虫练习
2018/12/13 Javascript
javascript(基于jQuery)实现鼠标获取选中的文字示例【测试可用】
2019/10/26 jQuery
vue 数据遍历筛选 过滤 排序的应用操作
2020/11/17 Javascript
token 机制和实现方式
2020/12/15 Javascript
[20:21]《一刀刀一天》第十六期:TI国际邀请赛正式打响,总奖金超过550万
2014/05/23 DOTA
python二分法实现实例
2013/11/21 Python
Python中的异常处理学习笔记
2015/01/28 Python
Python Web框架Flask中使用七牛云存储实例
2015/02/08 Python
修复CentOS7升级Python到3.6版本后yum不能正确使用的解决方法
2018/01/26 Python
在python3.5中使用OpenCV的实例讲解
2018/04/02 Python
解读python logging模块的使用方法
2018/04/17 Python
python 用下标截取字符串的实例
2018/12/25 Python
Python 处理图片像素点的实例
2019/01/08 Python
jupyter 实现notebook中显示完整的行和列
2020/04/09 Python
四方通行旅游网:台湾订房、出国旅游
2017/09/20 全球购物
最好的意大利皮夹克:D’Arienzo
2018/12/04 全球购物
介绍下Java的输入输出流
2014/01/22 面试题
编码实现字符串转整型的函数
2012/06/02 面试题
为数据库创建索引都需要注意些什么
2012/07/17 面试题
工程师岗位职责规定
2014/02/26 职场文书
劳动工资科岗位职责范本
2014/03/02 职场文书
银行党员批评与自我批评
2014/10/15 职场文书
营业用房租赁协议书
2014/11/26 职场文书
2015年业务员工作总结范文
2015/04/07 职场文书