基于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实现的二叉树算法和kmp算法实例
Apr 25 Python
Python实现115网盘自动下载的方法
Sep 30 Python
使用Python发送各种形式的邮件的方法汇总
Nov 09 Python
python二分查找算法的递归实现方法
May 12 Python
基于python的Tkinter编写登陆注册界面
Jun 30 Python
Python人脸识别初探
Dec 21 Python
Python3爬楼梯算法示例
Mar 04 Python
python两个_多个字典合并相加的实例代码
Dec 26 Python
Python实现计算长方形面积(带参数函数demo)
Jan 18 Python
python3实现无权最短路径的方法
May 12 Python
Python并发编程实例教程之线程的玩法
Jun 20 Python
基于Python编写简易版的天天跑酷游戏的示例代码
Mar 23 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
CMS中PHP判断系统是否已经安装的方法示例
2014/07/26 PHP
Yii框架关联查询with用法分析
2014/12/02 PHP
php表单加入Token防止重复提交的方法分析
2016/10/10 PHP
php rsa 加密,解密,签名,验签详解
2016/12/06 PHP
jqPlot jquery的页面图表绘制工具
2009/07/25 Javascript
JavaScript 密码强度判断代码
2009/09/05 Javascript
工作需要写的一个js拖拽组件
2011/07/28 Javascript
js读取被点击次数的简单实例(从数据库中读取)
2014/03/07 Javascript
把普通对象转换成json格式的对象的简单实例
2016/07/04 Javascript
AngularJs 国际化(I18n/L10n)详解
2016/09/01 Javascript
jQuery Validate格式验证功能实例代码(包括重名验证)
2017/07/18 jQuery
nodejs动态创建二维码的方法
2017/08/12 NodeJs
React Native之prop-types进行属性确认详解
2017/12/19 Javascript
Vue resource三种请求格式和万能测试地址
2018/09/26 Javascript
通过Kettle自定义jar包供javascript使用
2020/01/29 Javascript
基于html+css+js实现简易计算器代码实例
2020/02/28 Javascript
Vue单页面应用中实现Markdown渲染
2021/02/14 Vue.js
[54:43]DOTA2-DPC中国联赛 正赛 CDEC vs Dynasty BO3 第一场 2月22日
2021/03/11 DOTA
Python简单实现enum功能的方法
2016/04/25 Python
python中星号变量的几种特殊用法
2016/09/07 Python
python进阶之多线程对同一个全局变量的处理方法
2018/11/09 Python
通过python改变图片特定区域的颜色详解
2019/07/15 Python
python求加权平均值的实例(附纯python写法)
2019/08/22 Python
美国儿童运动鞋和服装零售商:Kids Foot Locker
2017/08/05 全球购物
中英双版中文教师求职信
2013/10/27 职场文书
土木工程个人自荐信范文
2013/11/30 职场文书
思想政治教育专业个人求职信范文
2013/12/20 职场文书
电子银行营销方案
2014/02/22 职场文书
检讨书格式
2015/01/23 职场文书
语文教师求职信范文
2015/03/20 职场文书
如何写新闻稿
2015/07/18 职场文书
2016年大学生寒假社会实践心得体会
2015/10/09 职场文书
Python基础学习之奇异的GUI对话框
2021/05/27 Python
详解JVM系列之内存模型
2021/06/10 Javascript
Python接口自动化之文件上传/下载接口详解
2022/04/05 Python
go goth封装第三方认证库示例详解
2022/08/14 Golang