基于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文件字符串转列表时遇到空行的问题
Jul 09 Python
python实现TF-IDF算法解析
Jan 02 Python
Python3中bytes类型转换为str类型
Sep 27 Python
详解Python3中的迭代器和生成器及其区别
Oct 09 Python
python抓取网页内容并进行语音播报的方法
Dec 24 Python
python xpath获取页面注释的方法
Jan 14 Python
Python学习笔记之lambda表达式用法详解
Aug 08 Python
Python文件路径名的操作方法
Oct 30 Python
python 实现方阵的对角线遍历示例
Nov 29 Python
浅谈SciPy中的optimize.minimize实现受限优化问题
Feb 29 Python
python 动态绘制爱心的示例
Sep 27 Python
Python趣味爬虫之用Python实现智慧校园一键评教
May 28 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
全国FM电台频率大全 - 18 湖南省
2020/03/11 无线电
Yii中实现处理前后台登录的新方法
2015/12/28 PHP
php微信开发接入
2016/08/27 PHP
Yii框架参数配置文件params用法实例分析
2019/09/11 PHP
JavaScript 学习笔记(十三)Dom创建表格
2010/01/21 Javascript
用XMLDOM和ADODB.Stream实现base64编码解码实现代码
2010/11/28 Javascript
JavaScript中两种链式调用实现代码
2011/01/12 Javascript
jQuery UI 实现email输入提示实例
2013/08/15 Javascript
javascript去除字符串中所有标点符号和提取纯文本的正则
2014/06/07 Javascript
js中函数调用的两种常用方法使用介绍
2014/07/17 Javascript
微信小程序动态显示项目倒计时效果
2017/06/13 Javascript
vue组件实现文字居中对齐的方法
2017/08/23 Javascript
用node-webkit把web应用打包成桌面应用(windows环境)
2018/02/01 Javascript
从Vuex中取出数组赋值给新的数组,新数组push时报错的解决方法
2018/09/18 Javascript
[03:04]DOTA2英雄基础教程 影魔
2013/12/11 DOTA
[00:15]天涯墨客终极技能展示
2018/08/25 DOTA
Python使用ntplib库同步校准当地时间的方法
2016/07/02 Python
Django中利用filter与simple_tag为前端自定义函数的实现方法
2017/06/15 Python
Python列表和元组的定义与使用操作示例
2017/07/26 Python
python numpy和list查询其中某个数的个数及定位方法
2018/06/27 Python
python学生管理系统学习笔记
2019/03/19 Python
python多任务之协程的使用详解
2019/08/26 Python
flask 实现token机制的示例代码
2019/11/07 Python
将tensorflow模型打包成PB文件及PB文件读取方式
2020/01/23 Python
Python 随机生成测试数据的模块:faker基本使用方法详解
2020/04/09 Python
pycharm实现print输出保存到txt文件
2020/06/01 Python
Python+OpenCV图像处理——打印图片属性、设置存储路径、调用摄像头
2020/10/22 Python
高校生生产实习自我鉴定
2013/09/21 职场文书
咖啡蛋糕店创业计划书
2014/01/28 职场文书
行政文秘岗位职责范本
2014/02/10 职场文书
毕业生自荐信格式
2014/03/07 职场文书
大三学生学年自我鉴定
2014/09/12 职场文书
异地年检委托书范本
2014/09/24 职场文书
加强作风建设心得体会
2014/10/22 职场文书
美容院管理规章制度
2015/08/05 职场文书
python基础之爬虫入门
2021/05/10 Python