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

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

img

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

def util():

read()

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

print('阅读文件')

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

img

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

img

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

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

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

text = f.read()

print(text)

运行代码发现报错:

img

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

运行效果如下图所示:

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

运行效果如下图所示:

img使用pkgutil库import pkgutil

def read():

data_bytes = pkgutil.get_data(__package__, 'data.txt')

data_str = data_bytes.decode()

print(data_str)

运行效果如下图所示:

img

pkgutil是Python自带的用于包管理相关操作的库,pkgutil能根据包名找到包里面的数据文件,然后读取为bytes型的数据。如果数据文件内容是字符串,那么直接decode()以后就是正文内容了。为什么pkgutil读取的数据文件是bytes型的内容而不直接是字符串类型? 这是因为并不是所有数据文件都是字符串,如果某些数据文件是二进制文件或者图片,那么以字符串方式打开就会导致报错。所以为了通用,pkgutil会以bytes型方式读入数据,这相当于open函数的“rb”读取方式。

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

例如修改代码结构如下图所示:

img

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

img

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

所以使用pkgutil可以大大简化读取包里面的数据文件的代码。

python读文件路径-在Python中按路径读取数据文件的几种方式相关推荐

  1. python读excel 包含格式_python里读写excel等数据文件的几种常用方式

    python处理数据文件第一步是要读取数据,文件类型主要包括文本文件(csv.txt等).excel文件.数据库文件.api等. 下面整理下python有哪些方式可以读取数据文件. 1. python ...

  2. layui 表格组件中实现动态增加数据行的一种方式

    layui 以界面简洁美观而吸引了不少开发人员,在使用table组件时,需要能编辑表格内容,动态增加数据行.编辑功能组件已支持.但动态增加数据行好像没有支持,网上提供的方式是,获得组件的数据集再加入一 ...

  3. python之从文件中按行读取数据

    #!/usr/bin/env python3 # -*- coding: utf-8 -*-__author__ = 'jiangwenwen'# 从文件中按行读取数据 file = open(&qu ...

  4. 关于python使用pandas导入dat数据文件的方法(可导入任意dat数据文件和csv数据文件)

    我相信大家在学习python中会遇到一些很苦恼的数据导入问题,csdn上面的数据导入五花八门,大多是在特定条件实行的数据导入,我在学习机器学习分类算法实现中发现csdn上面有很多dat数据文件,所以想 ...

  5. Python语言编程学习:numpy中的array格式数据切片与pandas中的dataframe格式数据切片、相互转换

    Python语言编程学习:numpy中的array格式数据切片与pandas中的dataframe格式数据切片.相互转换 目录 numpy中的array格式数据切片与pandas中的dataframe ...

  6. Python四种读取数据文件的方法

    下面介绍读取数据文件的方法: 首先说明下数据文件的格式 第一行为列名,第一列为编号 第一种:手写读取数据 f = file(路径名)x = []y = []for i, d in enumerate( ...

  7. python中交换两个变量值的几种方式?

    python中交换两个变量值的几种方式 1.python中独有的,也是最简单的方式: a,b=b,a 2.引入第三个变量,可以看作两个装满牛奶的瓶子a和瓶子b,如果我想交换这两个瓶子中的牛奶,就需要一 ...

  8. php中file_get_contents如何读取大容量文件

    php中file_get_contents如何读取大容量文件 一.总结 一句话总结:使用file_get_contents()进行分段读取,file_get_contents()函数可以分段读取 1. ...

  9. 在node.js中一次读取一行文件?

    本文翻译自:Read a file one line at a time in node.js? I am trying to read a large file one line at a time ...

  10. omf多路径 oracle_Oracle数据库使用OMF来简化数据文件的管理

    OMF托管文件是Oracle数据库提供的一种对数据文件进行自动管理的机制.当企业的数据库比较大,有数百个数据文件时,对数据库文件的管理就会变得非常的困难.但是采用OMF文件托管机制就可以很方便地解决这 ...

最新文章

  1. 程序员的精力呵护指南!来自十年程序员的精力管理经验
  2. hostswap dcevm
  3. 安装CCS5时仿真驱动出现问题的解决方法
  4. MySQL备份命令mysqldump参数说明与示例
  5. mysql中blog数据_zp blog
  6. Label 表达式绑定
  7. springmvc整合dubbo
  8. 如何在mysql下实现事务的提交与回滚
  9. 每日方法分享:手机识别图片文字怎么弄?
  10. mac 电脑 java wifi密码尝试器
  11. android代码计时,android秒表计时代码
  12. snapchat_如何截屏和共享Snapchat快照
  13. windows配置本地hosts
  14. 如何处理WordPress上传资源报HTTP错误
  15. Python——requests模块详解
  16. 关于serverlet
  17. 金立E6刷MIUI V5教程
  18. 英语学习网站超级大全
  19. intersect的用法简介
  20. 四川汶川地震 各地伤亡汇总(实时更新)

热门文章

  1. 开发日记-20190806 关键词 读书笔记《Linux 系统管理技术手册(第二版)》DAY 20
  2. [转]Python测试框架对比----unittest, pytest, nose, robot framework对比
  3. LSTM如何解决梯度消失或爆炸的?
  4. 循环遍历Java字符串字符的规范方法——类似python for ch in string
  5. ES _all、_source的使用——_all字段连接所有字段的值构成一个用空格(space)分隔的大string而被analyzed和index,document主体保存在_source中...
  6. python3 sha 系列 hex 加密 以sha256为例
  7. [bzoj1061] [NOI2008]志愿者招募
  8. Android的消息机制简单总结
  9. MyBatis学习总结[4]-ResultMap子元素
  10. hibernate中的锁