10.8 读��于包中的数�文件¶

问题¶

你的包中包�代�需�去读�的数�文件。你需�尽�能地用最便�的方���这件事。

解决方案¶

�设你的包中的文件组织�如下:

mypackage/
    __init__.py
    somedata.dat
    spam.py

现在�设spam.py文件需�读�somedata.dat文件中的内容。你�以用以下代��完�:

# spam.py
import pkgutil
data = pkgutil.get_data(__package__, 'somedata.dat')

由此产生的��是包�该文件的原始内容的字节字符串。

讨论¶

�读�数�文件,你�能会倾�于编写使用内置的I/ O功能的代�,如open()。但是这�方法也有一些问题。

首先,一个包对解释器的当�工作目录几乎没有控制�。因此,编程时任何I/O�作都必须使用�对文件�。由于�个模�包�有完整路径的__file__��,这弄清楚它的路径�是��能,但它很凌乱。

第二,包通常安装作为.zip或.egg文件,这些文件并��在文件系统上的一个普通目录里那样被�存。因此,你试图用open()对一个包�数�文件的归档文件进行�作,它根本�会工作。

pkgutil.get_data()函数是一个读�数�文件的高级工具,�用管包是如何安装以�安装在哪。它�是工作并将文件内容以字节字符串返回给你

get_data()的第一个�数是包�包�的字符串。你�以直接使用包�,也�以使用特殊的��,比如__package__。第二个�数是包内文件的相对�称。如果有必�,�以使用标准的Unix命�规范到��的目录,��最�的目录�然�于包中。