一日一技:Python读取包内里的数据文件的三种方式
一日一技:Python读取包内里的数据文件的三种方式
我们知道,写Python代码的时刻,若是一个包(package)内里的一个模块要导入另一个模块,那么我们可以使用相对导入:
假设当前代码结构如下图所示:
其中 test_1是一个包,在util.py内里想导入同一个包内里的 read.py中的 read函数,那么代码可以写为:
from .read import read
def util():
read()
其中的 .read示意当前包目录下的 read.py文件。此时 read.py文件中的内容如下:
def read():
print('阅读文件')
通过包外面的main.py运行代码,运行效果如下图所示:
现在,我们增添一个数据文件, data.txt,它的内容如下图所示:
而且想通过read.py去读取这个数据文件并打印出来。
修改read.py,试图使用相对路径来打开这个文件:
,,www.allbet8.us欢迎进入欧搏平台(Allbet Game),欧搏平台开放欧搏Allbet开户、欧搏Allbet代理开户、欧搏Allbet电脑客户端、欧搏AllbetAPP下载等业务。
def read():
with open('./data.txt', encoding='utf-8') as f:
text = f.read()
print(text)
运行代码发现报错:
这个缘故原由很简朴,就是若是数据文件的地址写为: ./data.txt,那么Python就会从当前工作区文件夹内里寻找 data.txt。由于我们运行的是 main.py,那么当前工作区就是 main.py所在的文件夹,而不是 test_1文件夹。以是就会泛起找不到文件的情形。
为了解决这个问题,我们有三种解决方式。
- 使用绝对路径(代码民众号排版可能有问题,以图片为准)
def read():
with open('/Users/kingname/Project/DataFileExample/test_1/data.txt',encoding='utf-8') as f:
text = f.read()
print(text)
运行效果如下图所示:
先获取 read.py文件的绝对路径,再拼接出数据文件的绝对路径:
import os
def read():
basepath = os.path.abspath(__file__)
folder = os.path.dirname(basepath)
data_path = os.path.join(folder, 'data.txt')
with open(data_path, encoding='utf-8') as f:
text = f.read()
print(text)
运行效果如下图所示:
- 使用pkgutil库
import pkgutil
def read():
data_bytes = pkgutil.get_data(package, 'data.txt')
data_str = data_bytes.decode()
print(data_str)
运行效果如下图所示:

pkgutil是Python自带的用于包治理相关操作的库, pkgutil能凭据包名找到包内里的数据文件,然后读取为bytes型的数据。若是数据文件内容是字符串,那么直接 decode()以后就是正文内容了。
使用 pkgutil另有一个利益,就是只要知道包名就可以找到对应包下面的数据文件,数据文件并不一定要在当前包内里。
例如修改代码结构如下图所示:

另一个包 test_2内里有一个数据文件 data2.txt。此时若是要在 teat_1包的 read.py中读取 data2.txt中的内容,那么只需要修改 pkgutil.get_data的第一个参数为 test_2,第二个参数为数据文件的名字即可,运行效果如下图所示:

而前两种方式都不如 pkgutil简朴。
以是使用 pkgutil可以大大简化读取包内里的数据文件的代码。
> 封面图片作者:产物司理
kingname
0
珍藏
入金通道菜包钱包(caibao.it)是使用TRC-20协议的Usdt第三方支付平台。免费提供Usdt钱包支付接口、Usdt自动充值接口、Usdt无需实名寄售回收。菜包Usdt钱包一键生成Usdt钱包、一键调用API接口、一键无实名出售Usdt。我是你的粉丝,看我
USDT钱包支付菜包钱包(caibao.it)是使用TRC-20协议的Usdt第三方支付平台。免费提供Usdt钱包支付接口、Usdt自动充值接口、Usdt无需实名寄售回收。菜包Usdt钱包一键生成Usdt钱包、一键调用API接口、一键无实名出售Usdt。太有心意了
联博以太坊高度www.326681.com采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。我反正情有独钟了