📜  Python中的 HDF5 文件

📅  最后修改于: 2022-05-13 01:54:59.330000             🧑  作者: Mango

Python中的 HDF5 文件

HDF5 文件代表 Hierarchical Data Format 5。它是一个开源文件,可以方便地存储大量数据。顾名思义,它将数据以分层结构存储在单个文件中。因此,如果我们想快速访问文件的特定部分而不是整个文件,我们可以使用 HDF5 轻松实现。此功能在普通文本文件中看不到,因此 HDF5 实际上是一个新概念,看起来很流行。要使用 HDF5,需要导入 numpy。一个重要的特性是它可以将元集附加到文件中的每个数据,从而提供强大的搜索和访问。让我们开始将 HDF5 安装到计算机上。
要安装 HDF5,请在终端中输入:

pip install h5py

我们将使用一个名为 HDF5 Viewer 的特殊工具以图形方式查看这些文件并对其进行处理。要安装 HDF5 Viewer,请输入以下代码:

pip install h5pyViewer

由于 HDF5 在 numpy 上工作,我们也需要在我们的机器上安装 numpy。

python -m pip install numpy

在所有安装完成后,让我们看看如何写入 HDF5 文件。
注意:使用 HDF5 需要对 numpy 及其属性有基本的了解,因此必须熟悉 numpy 才能理解本文后面的代码。要了解有关 numpy 的更多信息,请单击此处。
我们将创建一个文件并在其中保存一个随机的 numpy 数组:

Python3
# Python program to demonstrate
# HDF5 file
 
import numpy as np
import h5py
 
# initializing a random numpy array
arr = np.random.randn(1000)
 
# creating a file
with h5py.File('test.hdf5', 'w') as f:
    dset = f.create_dataset("default", data = arr)


Python3
# open the file as 'f'
with h5py.File('test.hdf5', 'r') as f:
    data = f['default']
     
    # get the minimum value
    print(min(data))
     
    # get the maximum value
    print(max(data))
     
    # get the values ranging from index 0 to 15
    print(data[:15])


Python3
import numpy as np
import h5py
 
 
arr1 = np.random.randn(10000)
arr2 = np.random.randn(10000)
 
with h5py.File('test_read.hdf5', 'w') as f:
    f.create_dataset('array_1', data = arr1)
    f.create_dataset('array_2', data = arr2)


Python3
with h5py.File('test_read.hdf5', 'r') as f:
    d1 = f['array_1']
    d2 = f['array_2']
 
    data = d2[d1[:]>1]


输出:

pythonHDF5

在上面的代码中,我们首先导入之前安装的模块。然后我们将变量 arr 初始化为一个 numpy 的随机数组,范围为 1000。
因此,我们可以说这个数组由大量数据组成。接下来,我们以“只写”属性打开文件。这意味着如果没有任何名为test.hdf5的文件,那么它将创建一个,否则它将删除(覆盖)现有文件的内容。在打开文件时,我们使用 with 而不是 open,因为与 open() 方法相比,它具有优势。如果使用 with 打开文件,我们不需要关闭文件 最后,我们使用 .create_dataset() 将变量dset设置为之前创建的数组。
我们现在将读取我们上面写的文件:

Python3

# open the file as 'f'
with h5py.File('test.hdf5', 'r') as f:
    data = f['default']
     
    # get the minimum value
    print(min(data))
     
    # get the maximum value
    print(max(data))
     
    # get the values ranging from index 0 to 15
    print(data[:15])
    

输出:

蟒蛇HDF5

在这里,我们再次打开文件,但这次我们通过“只读”属性打开它,这样就不能对文件进行任何更改。我们将变量数据设置为我们存储在上一个文件中的数据。让我们看看输出:
似乎没有什么新鲜事。它只是一个数组,我们像在数组中一样打印出数字。但是,变量 data 不是数组。它实际上与数组非常不同。这是一个数据集。它不是将数据存储在 RAM 中,而是将其保存在计算机的硬盘驱动器中,从而像目录一样维护结构的层次结构:

蟒蛇HDF5

当使用下面的行时

data = f['default']

在前面的代码中,我们没有直接访问文件的内容,而是创建了一个指向我们内容的指针。让我们看看它的一个优点:

Python3

import numpy as np
import h5py
 
 
arr1 = np.random.randn(10000)
arr2 = np.random.randn(10000)
 
with h5py.File('test_read.hdf5', 'w') as f:
    f.create_dataset('array_1', data = arr1)
    f.create_dataset('array_2', data = arr2)

我们创建了两个数据集,但整个过程与以前相同。使用“w”属性创建一个名为“test_read.hdf5”的文件,它包含两个随机数数据集( array1array2 )。现在假设我们只想读取array2的选择性部分。例如,我们要读取array2中对应于array1的值大于1的部分。如果我们使用传统的文本文件而不是 HDF5 文件,几乎不可能实现这一点。这正是我们看到了 HDF5 文件的强大之处:

Python3

with h5py.File('test_read.hdf5', 'r') as f:
    d1 = f['array_1']
    d2 = f['array_2']
 
    data = d2[d1[:]>1]

我们使用[:]将数据集d1的副本创建到 RAM 中。我们这样做是因为无法将数据集(硬盘驱动器中的数据)与整数进行比较。
输出:

蟒蛇HDF5

因此,我们得出结论,当我们处理大文件时,HDF5 文件是我们最好的工具,因为它允许我们选择性地读取和写入文件,否则会消耗大量内存和时间。

蟒蛇HDF5