一日一技: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,试图使用相对路径来打开这个文件:

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可以大大简化读取包里面的数据文件的代码。

目录
相关文章
|
1月前
|
数据采集 数据可视化 数据挖掘
利用Python自动化处理Excel数据:从基础到进阶####
本文旨在为读者提供一个全面的指南,通过Python编程语言实现Excel数据的自动化处理。无论你是初学者还是有经验的开发者,本文都将帮助你掌握Pandas和openpyxl这两个强大的库,从而提升数据处理的效率和准确性。我们将从环境设置开始,逐步深入到数据读取、清洗、分析和可视化等各个环节,最终实现一个实际的自动化项目案例。 ####
124 10
|
2月前
|
机器学习/深度学习 Python
堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能
本文深入探讨了堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能。文章详细介绍了堆叠的实现步骤,包括数据准备、基础模型训练、新训练集构建及元学习器训练,并讨论了其优缺点。
82 3
|
3天前
|
存储 算法 Serverless
剖析文件共享工具背后的Python哈希表算法奥秘
在数字化时代,文件共享工具不可或缺。哈希表算法通过将文件名或哈希值映射到存储位置,实现快速检索与高效管理。Python中的哈希表可用于创建简易文件索引,支持快速插入和查找文件路径。哈希表不仅提升了文件定位速度,还优化了存储管理和多节点数据一致性,确保文件共享工具高效运行,满足多用户并发需求,推动文件共享领域向更高效、便捷的方向发展。
|
14天前
|
数据采集 Web App开发 监控
Python爬虫:爱奇艺榜单数据的实时监控
Python爬虫:爱奇艺榜单数据的实时监控
|
24天前
|
计算机视觉 Python
如何使用Python将TS文件转换为MP4
本文介绍了如何使用Python和FFmpeg将TS文件转换为MP4文件。首先需要安装Python和FFmpeg,然后通过`subprocess`模块调用FFmpeg命令,实现文件格式的转换。代码示例展示了具体的操作步骤,包括检查文件存在性、构建FFmpeg命令和执行转换过程。
41 7
|
1月前
|
安全
Python-打印99乘法表的两种方法
本文详细介绍了两种实现99乘法表的方法:使用`while`循环和`for`循环。每种方法都包括了步骤解析、代码演示及优缺点分析。文章旨在帮助编程初学者理解和掌握循环结构的应用,内容通俗易懂,适合编程新手阅读。博主表示欢迎读者反馈,共同进步。
|
1月前
|
数据采集 分布式计算 大数据
构建高效的数据管道:使用Python进行ETL任务
在数据驱动的世界中,高效地处理和移动数据是至关重要的。本文将引导你通过一个实际的Python ETL(提取、转换、加载)项目,从概念到实现。我们将探索如何设计一个灵活且可扩展的数据管道,确保数据的准确性和完整性。无论你是数据工程师、分析师还是任何对数据处理感兴趣的人,这篇文章都将成为你工具箱中的宝贵资源。
|
1月前
|
Python 容器
[oeasy]python048_用变量赋值_连等赋值_解包赋值_unpack_assignment _
本文介绍了Python中变量赋值的不同方式,包括使用字面量和另一个变量进行赋值。通过`id()`函数展示了变量在内存中的唯一地址,并探讨了变量、模块、函数及类类型的地址特性。文章还讲解了连等赋值和解包赋值的概念,以及如何查看已声明的变量。最后总结了所有对象(如变量、模块、函数、类)都有其类型且在内存中有唯一的引用地址,构成了Python系统的基石。
30 5
|
1月前
|
JSON 安全 API
Python调用API接口的方法
Python调用API接口的方法
230 5
|
5月前
|
SQL JSON C语言
Python中字符串的三种定义方法
Python中字符串的三种定义方法
134 2
下一篇
开通oss服务