基于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 获取进程pid号的方法
Mar 10 Python
Python多线程编程(二):启动线程的两种方法
Apr 05 Python
深入解析Python中的上下文管理器
Jun 28 Python
Python探索之URL Dispatcher实例详解
Oct 28 Python
Python set常用操作函数集锦
Nov 15 Python
numpy中实现二维数组按照某列、某行排序的方法
Apr 04 Python
Python选择网卡发包及接收数据包
Apr 04 Python
Django 大文件下载实现过程解析
Aug 01 Python
pyenv与virtualenv安装实现python多版本多项目管理
Aug 17 Python
基于python traceback实现异常的获取与处理
Dec 13 Python
python+Selenium自动化测试——输入,点击操作
Mar 06 Python
15个Pythonic的代码示例(值得收藏)
Oct 29 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 Pear 安装及使用
2009/03/19 PHP
详解如何在云服务器上部署Laravel
2017/06/30 PHP
filemanage功能中用到的common.js
2007/04/08 Javascript
javascript操作table(insertRow,deleteRow,insertCell,deleteCell方法详解)
2013/12/16 Javascript
JavaScript按位运算符的应用简析
2014/02/04 Javascript
jquery简单图片切换显示效果实现方法
2015/01/14 Javascript
Bootstrap3 input输入框插入glyphicon图标的方法
2016/05/16 Javascript
Node.js使用orm2进行update操作时关联字段无法修改的解决方法
2017/06/13 Javascript
js实现文字列表无缝滚动效果
2017/06/23 Javascript
Vue.js组件间的循环引用方法示例
2017/12/27 Javascript
vue2.0 子组件改变props值,并向父组件传值的方法
2018/03/01 Javascript
vue项目中应用ueditor自定义上传按钮功能
2018/04/27 Javascript
vue中使用sessionStorage记住密码功能
2018/07/24 Javascript
CentOS7中源码编译安装NodeJS的完整步骤
2018/10/13 NodeJs
JavaScript定时器设置、使用与倒计时案例详解
2019/07/08 Javascript
vue登录页面cookie的使用及页面跳转代码
2019/07/10 Javascript
jQuery实现购物车全功能
2021/01/11 jQuery
[01:01:13]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第三场
2018/04/06 DOTA
Python使用代理抓取网站图片(多线程)
2014/03/14 Python
python实现apahce网站日志分析示例
2014/04/02 Python
Python中的类学习笔记
2014/09/23 Python
在Python的Django框架中创建语言文件
2015/07/27 Python
用Python下载一个网页保存为本地的HTML文件实例
2018/05/21 Python
Python之inspect模块实现获取加载模块路径的方法
2018/10/16 Python
Django之模型层多表操作的实现
2019/01/08 Python
python机器人运动范围问题的解答
2019/04/29 Python
Python内置random模块生成随机数的方法
2019/05/31 Python
详解利用css3的var()实现运行时改变scss的变量值
2021/03/02 HTML / CSS
加拿大最大的钻石商店:Peoples Jewellers
2018/01/01 全球购物
会计专业自我评价
2014/02/12 职场文书
化学教学随笔感言
2014/02/19 职场文书
移风易俗倡议书
2014/04/15 职场文书
2014年学校食堂工作总结
2014/11/25 职场文书
2015初中团支部工作总结
2015/07/21 职场文书
Jmerte 分布式压测及分布式压测配置
2022/04/30 Java/Android
Nginx代理Redis哨兵主从配置的实现
2022/07/15 Servers