前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一日一技:Python读取包里面的数据文件的三种方法

一日一技:Python读取包里面的数据文件的三种方法

作者头像
青南
发布2019-05-27 16:57:11
2.3K0
发布2019-05-27 16:57:11
举报
文章被收录于专栏:未闻Code未闻Code

我们知道,写Python代码的时候,如果一个包(package)里面的一个模块要导入另一个模块,那么我们可以使用相对导入:

假设当前代码结构如下图所示:

其中 test_1是一个包,在util.py里面想导入同一个包里面的 read.py中的 read函数,那么代码可以写为:

代码语言:javascript
复制
from .read import read

def util():    read()

其中的 .read表示当前包目录下的 read.py文件。此时 read.py文件中的内容如下:

代码语言:javascript
复制
def read():    print('阅读文件')

通过包外面的main.py运行代码,运行效果如下图所示:

现在,我们增加一个数据文件, data.txt,它的内容如下图所示:

并且想通过read.py去读取这个数据文件并打印出来。

修改read.py,试图使用相对路径来打开这个文件:

代码语言:javascript
复制
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文件夹。所以就会出现找不到文件的情况。

为了解决这个问题,我们有三种解决方式。

  • 使用绝对路径(代码公众号排版可能有问题,以图片为准)
代码语言:javascript
复制
def read():    with open('/Users/kingname/Project/DataFileExample/test_1/data.txt', encoding='utf-8') as f:        text = f.read()        print(text)

运行效果如下图所示:

先获取 read.py文件的绝对路径,再拼接出数据文件的绝对路径:

代码语言:javascript
复制
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库
代码语言:javascript
复制
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可以大大简化读取包里面的数据文件的代码。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 未闻Code 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档