读取python包内数据⽂件⽅法
读取python包内数据⽂件⽅法
摘要
在使⽤python程序时,经常会遇到⾃定义的包内包含数据⽂件的情况,这时如果⽤户想从外部调⽤包内⽅法时,就会出现⽆法到数据⽂件的错误。这⾥介绍了使⽤ pkgutil模块 来解决该类问题的⽅法。
问题介绍
以前写了⼀个计算放射性毒性计算的程序,每次计算时需要将输⼊⽂件与程序以及依赖的数据⽂件放在⼀个⽬录下,计算结束后,输出⽂件也在同样的⽬录下,这样就需要每次计算时都要拷贝⼀份程序和依赖的数据⽂件,⾮常⿇烦,所以决定修改程序结构,将原来的毒性计算程序做成包的形式,这样就可以⽆需拷贝计算程序⽽在任意⽬录下进⾏调⽤计算,和结果的输出。但是在修改程序过程中发现,由于原计算程序需要读取很多依赖的数据⽂件,这样在包外部调⽤该计算程序的时候会出现不到⽂件的错误。经过查解决⽅案,最终决定选择使⽤pkgutil模块 来解决该类问题。
解决⽅法
通过在原计算程序中加⼊
python怎么读取文件中的数据
import pkgutil
def getDataInPackage(filename):
data_bytes = _data(__package__, filename)
data_str = data_bytes.decode("utf8")
return data_str
其中get_data 可以⽤来从⼀个包中的数据⽂件中获取数据,由于该函数返回的是 binary string,所以需要解码成string类型。
其他需要注意问题
在使⽤上述getDataInPackage函数返回的数据进⾏操作时,由于需要对原来的⽂本数据⼀⾏⾏进⾏操作,所以使⽤了split函数,但需要注意换⾏符的问题。在打字机时代就有了这⼏个符号的设计,其实’\r’的本意是回到⾏⾸,’\n’的本意是换⾏。所以回车相当于做的是’\r\n’或者’\n\r’。到了计算机时代沿⽤了这个符号设计,但是估计是换⾏并回⾏⾸是⼀体的了基本上,所以出现了这⼏种设计:’\r’就是换⾏并回⾏⾸,’\n’就是换⾏并回⾏⾸,⽤’\r\n’表⽰换⾏并回⾏⾸。其中Windows是’\r\n’,Linux是’\n’。因此在windows系统下,split函数需要传⼊参数’\r\n’
nuclID = getDataInPackage(filename).split('\r\n')
不能写成:
nuclID = getDataInPackage(filename).split('\n')
否则会出现不必要的问题。
总结
使⽤ pkgutil模块 可以⽤来读取包内包含数据⽂件,但需要注意⼀些⼆进制字符码转码的问题。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。