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

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

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

咱们知道,写Python代码的时候,若是一个包(package)里面的一个模块要导入另外一个模块,那么咱们可使用相对导入:函数

假设当前代码结构以下图所示:
一日一技:Python读取包里面的数据文件的三种方法spa

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

from .read import read

def util():
    read()

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

def read():
    print('阅读文件')

经过包外面的main.py运行代码,运行效果以下图所示:
一日一技:Python读取包里面的数据文件的三种方法blog

如今,咱们增长一个数据文件, data.txt,它的内容以下图所示:
一日一技:Python读取包里面的数据文件的三种方法图片

而且想经过read.py去读取这个数据文件并打印出来。utf-8

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

def read():
    with open('./data.txt', encoding='utf-8') as f:
        text = f.read()
        print(text)

运行代码发现报错:
一日一技:Python读取包里面的数据文件的三种方法get

这个缘由很简单,就是若是数据文件的地址写为: ./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)

运行效果以下图所示:
一日一技:Python读取包里面的数据文件的三种方法

先获取 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)

运行效果以下图所示:
一日一技:Python读取包里面的数据文件的三种方法

  • 使用pkgutil库
    import pkgutil

def read():
data_bytes = pkgutil.get_data(package, 'data.txt')
data_str = data_bytes.decode()
print(data_str)

运行效果以下图所示:
![](https://s4.51cto.com/images/blog/202012/03/587b79f34820b07f4eaf3f8c0c1bd4ce.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

pkgutil是Python自带的用于包管理相关操做的库, pkgutil能根据包名找到包里面的数据文件,而后读取为bytes型的数据。若是数据文件内容是字符串,那么直接 decode()之后就是正文内容了。

使用 pkgutil还有一个好处,就是只要知道包名就能够找到对应包下面的数据文件,数据文件并不必定要在当前包里面。

例如修改代码结构以下图所示:
![](https://s4.51cto.com/images/blog/202012/03/0aea96302a741aca21a8bd7050bc450a.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

另外一个包 test_2里面有一个数据文件 data2.txt。此时若是要在 teat_1包的 read.py中读取 data2.txt中的内容,那么只须要修改 pkgutil.get_data的第一个参数为 test_2,第二个参数为数据文件的名字便可,运行效果以下图所示:
![](https://s4.51cto.com/images/blog/202012/03/93cc8268702bddd6bbe18f80ff73a7d6.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

而前两种方法都不如 pkgutil简单。

因此使用 pkgutil能够大大简化读取包里面的数据文件的代码。

> 封面图片做者:产品经理

kingname
相关文章
相关标签/搜索