參考自
pytables的主要目的是提供乙個好的操作hdf5檔案的方法。
hdf檔案是分層資料格式(hierarchical data format
)的簡稱。資料主要由組(groups)和資料集(datasets)組成。其中,組的作用類似於資料夾,用於包含資料集或者其他組。組之間層層包含,構成了分層次的結構。由於hdf5檔案具有分層儲存的特點,可以儲存元資料,支援多種壓縮模式,具有即時壓縮的特點。因此hdf5檔案非常適合儲存大容量,包含元資訊的科學資料。
在pytables中的資料集主要有兩種形式: 表(tables)和陣列(array)。
其中,表是由結構相同的記錄(records)組成。記錄儲存了不同的字段(fields),每個欄位的儲存的變數的資料型別是相同的。在hdf5的術語中,表中的記錄也被稱為復合資料型別。
比如,宣告乙個類(class),包含命名的字段和型別資訊:
class之後,就可以基於這個類構造表,然後向其中寫資料並儲存。particle(isdescription):
name = stringcol(16) #
16-character string
idnumber = int64col() #
signed 64-bit integer
adccount = uint16col() #
unsigned short integer
tdccount = uint8col() #
unsigned byte
grid_i = int32col() #
integer
grid_j = int32col() #
integer
#a sub-structure (nested data-type)
class
properties(isdescription):
pressure = float32col(shape=(2,3)) #
2-d float array (single-precision)
energy = float64col(shape=(2,3,4)) #
3-d float array (double-precision)
另乙個重要的是陣列,他類似於表,但不同之處在於其中所有的元件都是同構的。它們有不同的特點,比如泛型,可擴充套件,可變長度。
pytables具有如下優點:python所具備的物件導向和可內省,hdf5強大的資料管理功能,numpy的靈活性,以及numexpr對大規模網格物件資料的操作能力。具有以下特性:
pytables可以在乙個樹狀結構中管理表和陣列。為了實現這個功能,pytables動態地建立了物件樹的結構,從而模擬hdf5在磁碟中的儲存方式。通過遍歷動態樹實現對hdf5物件的讀取。通過檢查節點的元資料(metadata),可以了解物件中儲存了什麼格式的資料。
在物件樹中不同的節點,是pytables類中的實體。有幾種類,但最重要的類是結點(node),組(group)和葉(leaf)類。pytables樹中所有的節點(nodes)都是結點(node)類的實體。組和葉都是node類的子類。組實體是包含了0個或更多個葉節點的組結構。葉實體是不再包含其他組或葉,只包含實際資料的容器。表(table),陣列(array),carray,earray,vlarray,以及未定(unimplemented)類則是葉的子類。
對組和葉進行操作類似於在unix檔案系統中對資料夾和檔案進行操作。在 pytables 中,物件樹中的物件通常通過完整(絕對)路徑名來引用。此完整路徑可以指定為字串(例如 '/subgroup2/table3',使用"/"作分隔符),或者以自然命名訪問(例如file.root.subgroup2.table3)。
並非檔案中的所有資料都載入到物件樹中。元資料(即,描述實際資料結構的特殊資料)僅在使用者希望訪問時才載入。此外,實際資料直到使用者請求時才讀取。使用物件樹(元資料),您可以檢索有關磁碟上物件的資訊,例如表名、標題、列名、列中的資料型別、行數,組的形狀、型別碼等。您還可以在樹中搜尋特定型別的資料,然後讀取並處理這些資料。
值得注意的是,pytables採用了元資料快取系統,該系統延遲載入節點(即按需載入),並解除安裝一段時間未使用的節點。需要強調的是,節點在未被引用之後進入快取,並且可以直接從快取中恢復,而無需從磁碟執行反序列化過程。此功能允許以低記憶體消耗快速處理具有大型層次結構的檔案,同時保留以前實現的物件樹的所有強大瀏覽功能。
為了更好地理解這個物件樹實體的動態特性,讓我們從乙個示例pytables指令碼(可以在examples/objecttree.py中找到)開始建立乙個hdf5檔案:
import這個小程式建立了乙個名為 objecttree.h5 的 hdf5 檔案,其結構如圖 所示。建立檔案時,物件樹中的元資料會在記憶體中更新,而實際資料會儲存到磁碟。當您關閉檔案時,物件樹不再可用。但是,當您重新開啟此檔案時,物件樹將根據磁碟上的元資料在記憶體中重建(這是以惰性方式完成的,以便僅載入使用者所需的物件),從而允許您使用它與最初建立它時的方式完全相同。tables as tb
class
particle(tb.isdescription):
identity = tb.stringcol(itemsize=22, dflt="
", pos=0) #
character string
idnumber = tb.int16col(dflt=1, pos = 1) #
short integer
speed = tb.float32col(dflt=1, pos = 2) #
single-precision
#以寫模式開啟乙個檔案
fileh = tb.open_file("
objecttree.h5
", mode = "w"
)#得到hdf5根組
root =fileh.root
#建立組
group1 = fileh.create_group(root, "
group1")
group2 = fileh.create_group(root, "
group2")
#在根組中建立陣列1
array1 = fileh.create_array(root, "
array1
", ["
string
", "
array
"], "
string array")
#分別在組1,2中建立表1,2
table1 = fileh.create_table(group1, "
table1
", particle)
table2 = fileh.create_table("
/group2
", "
table2
", particle)
#在組1中建立最後乙個表
array2 = fileh.create_array("
/group1
", "
array2
", [1,2,3,4])
#填充**
for table in
(table1, table2):
#get the record object associated with the table:
row =table.row
#fill the table with 10 records
for i in range(10):
#first, assign the values to the particle record
row['
identity
'] = f'
this is particle:
'row[
'idnumber
'] =i
row[
'speed
'] = i * 2.
#this injects the record values
#flush the table buffers
table.flush()
#finally, close the file (this also will flush all the remaining buffers!)
fileh.close()
圖 1:具有 2 個子組、2 個表和 1 個陣列的 hdf5 示例。
在圖 2 中,您可以看到讀取上述 objecttree.h5 檔案時建立的物件樹示例(實際上,讀取任何受支援的通用 hdf5 檔案時總是會建立這樣的物件樹)。花點時間理解它是值得的,它將幫助您理解記憶體中 pytables 物件的關係。
圖 2:pytables 物件樹示例。
plist 儲存資料學習
載入plist的資料 特別重要的類 nsbundle 乙個nsbundle對應乙個資料夾 利用nsbundle就能訪問手機裡面的任何資源 1 得到對應所有資源的bundle nsbundle bundle nsbundle mainbundle 2 通過bundle得到對應資源的全路徑 nsstri...
python學習之儲存資料
使用模組json來儲存儲存使用者資料。儲存dump,載入load 1.使用json.dump 和json.load 編寫乙個儲存一組數字的程式 儲存資料 import json 匯入模組 numbers 1,2,3,4,5,6 建立數字列表 filename numbers.json 生成檔案,js...
Android 學習筆記14 資料儲存
android的資料儲存有4中方式 sharedpreferences sqlite content provider和file sharepreferences 提供輕量型資料儲存,一般使用者儲存配置資訊 本質上是xml檔案上的鍵值對,通常用來儲存一些簡單的配置資訊。其儲存位置在 data dat...