10.8 讀取位于包中的數(shù)據(jù)文件

2018-02-24 15:27 更新

問題

你的包中包含代碼需要去讀取的數(shù)據(jù)文件。你需要盡可能地用最便捷的方式來做這件事。

解決方案

假設(shè)你的包中的文件組織成如下:

mypackage/
    __init__.py
    somedata.dat
    spam.py

現(xiàn)在假設(shè)spam.py文件需要讀取somedata.dat文件中的內(nèi)容。你可以用以下代碼來完成:

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

由此產(chǎn)生的變量是包含該文件的原始內(nèi)容的字節(jié)字符串。

討論

要讀取數(shù)據(jù)文件,你可能會(huì)傾向于編寫使用內(nèi)置的I/ O功能的代碼,如open()。但是這種方法也有一些問題。

首先,一個(gè)包對(duì)解釋器的當(dāng)前工作目錄幾乎沒有控制權(quán)。因此,編程時(shí)任何I/O操作都必須使用絕對(duì)文件名。由于每個(gè)模塊包含有完整路徑的file變量,這弄清楚它的路徑不是不可能,但它很凌亂。

第二,包通常安裝作為.zip或.egg文件,這些文件像文件系統(tǒng)上的一個(gè)普通目錄一樣不會(huì)被保留。因此,你試圖用open()對(duì)一個(gè)包含數(shù)據(jù)文件的歸檔文件進(jìn)行操作,它根本不會(huì)工作。

pkgutil.get_data()函數(shù)是一個(gè)讀取數(shù)據(jù)文件的高級(jí)工具,不用管包是如何安裝以及安裝在哪。它只是工作并將文件內(nèi)容以字節(jié)字符串返回給你

get_data()的第一個(gè)參數(shù)是包含包名的字符串。你可以直接使用包名,也可以使用特殊的變量,比如package。第二個(gè)參數(shù)是包內(nèi)文件的相對(duì)名稱。如果有必要,可以使用標(biāo)準(zhǔn)的Unix命名規(guī)范到不同的目錄,只有最后的目錄仍然位于包中。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)