基于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通过exifread模块获得图片exif信息的方法
Mar 16 Python
以Flask为例讲解Python的框架的使用方法
Apr 29 Python
简单介绍Python中用于求最小值的min()方法
May 15 Python
python冒泡排序简单实现方法
Jul 09 Python
使用python编写简单的小程序编译成exe跑在win10上
Jan 15 Python
对python:print打印时加u的含义详解
Dec 15 Python
Django网络框架之创建虚拟开发环境操作示例
Jun 06 Python
python爬虫之自制英汉字典
Jun 24 Python
python实现数据分析与建模
Jul 11 Python
python 利用pywifi模块实现连接网络破解wifi密码实时监控网络
Sep 16 Python
Python编程快速上手——正则表达式查找功能案例分析
Feb 28 Python
Python venv虚拟环境配置过程解析
Jul 08 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 随机数的产生、页面跳转、件读写、文件重命名、switch语句
2009/08/07 PHP
php array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
2011/07/12 PHP
php初始化对象和析构函数的简单实例
2014/03/11 PHP
ThinkPHP中__initialize()和类的构造函数__construct()用法分析
2014/11/29 PHP
完美解决phpdoc导出文档中@package的warning及Error的错误
2016/05/17 PHP
实现PHP中session存储及删除变量
2018/10/15 PHP
PHP实现数组和对象的相互转换操作示例
2019/03/20 PHP
javascript操作文本框readOnly
2007/05/15 Javascript
JS 面向对象的5钟写法
2009/07/31 Javascript
动态加载外部javascript文件的函数代码分享
2011/07/28 Javascript
javascript权威指南 学习笔记之javascript数据类型
2011/09/24 Javascript
JavaScript 代码压缩工具小结
2012/02/27 Javascript
node.js中的fs.symlinkSync方法使用说明
2014/12/15 Javascript
使用mini-define实现前端代码的模块化管理
2014/12/25 Javascript
浅谈jQuery.easyui的datebox格式化时间
2015/06/25 Javascript
js闭包用法实例详解
2016/12/13 Javascript
详解微信小程序入门五: wxml文件引用、模版、生命周期
2017/01/20 Javascript
浅谈javascript的url参数parse和build函数
2017/03/04 Javascript
原生js获取left值和top值的三种方法
2017/08/02 Javascript
Echarts基本用法_动力节点Java学院整理
2017/08/11 Javascript
Vue中的Vux配置指南
2017/12/08 Javascript
jQuery实现上下滚动公告栏详细代码
2018/11/21 jQuery
layer 关闭指定弹出层的例子
2019/09/25 Javascript
[01:22:42]2014 DOTA2华西杯精英邀请赛 5 24 DK VS LGD
2014/05/26 DOTA
python中django框架通过正则搜索页面上email地址的方法
2015/03/21 Python
python3 读取Excel表格中的数据
2018/10/16 Python
python查看文件大小和文件夹内容的方法
2019/07/08 Python
Python 二叉树的层序建立与三种遍历实现详解
2019/07/29 Python
pycharm 安装JPype的教程
2019/08/08 Python
什么是python的函数体
2020/06/19 Python
html5 跨文档消息传输示例探讨
2013/04/01 HTML / CSS
重阳节演讲稿:尊敬帮助老人 弘扬传统美德
2014/09/25 职场文书
期末复习计划
2015/01/19 职场文书
年终奖金发放管理制度,中小企业适用,拿去救急吧!
2019/07/12 职场文书
vue+springboot实现登录验证码
2021/05/27 Vue.js
HTML CSS 一个标签实现带动画的抖音LOGO
2022/04/26 HTML / CSS