无法使用 python + h5py 访问外部 link
Can't access external link with python + h5py
最近我开始使用 .hdf5
个文件,但仍然不知道如何正确使用外部链接。
我有几个 .hdf5
文件。每个文件都有相同的结构,例如相同的键和数据类型。我想将它们合并到一个文件中,但将它们分开,每个文件使用不同的密钥。
这是我的做法:
myfile = h5py.File("/path_to_the_directory/merged_images.hdf5", 'w')
myfile['0.000'] = h5py.ExternalLink("img_000.hdf5", "/path_to_the_directory/images")
myfile['0.001'] = h5py.ExternalLink("img_001.hdf5", "/path_to_the_directory/images")
myfile.flush()
然后我尝试阅读它:
myfile = h5py.File("/path_to_the_directory/merged_images.hdf5", 'r')
keys = list(myfile.keys())
print(keys)
print(list(myfile[keys[0]]))
行 print(keys)
给了我 ['0.000', '0.001']
。所以,我相信文件的结构没问题。
接下来的几行给了我一个例外:
KeyError: "Unable to open object (unable to open external file, external link file name = 'img_000.hdf5')"
我是不是做错了什么?文档很差,我没有
在那里找不到相关的用例。
问题是您混淆了路径。区分两种类型的路径很重要:
- 文件路径(硬盘上的位置)。
- 数据集路径:此路径是 HDF5 文件的内部路径,不取决于您存储文件的位置。
h5py.ExternalLink
的语法,如the documentation所述,是:
myfile['/path/of/link'] = h5py.ExternalLink('/path/to/file.hdf5', '/path/to/dataset')
Thereby I would like to encourage you to use a relative file path for the ExternalLink
. If you do that, then everything will continue to work even if you move the collection of files to a new location on your hard drive (or give them to somebody else).
使用正确的路径,您的示例可以正常工作,如下所示。
请注意,为了说明我对相对文件路径的评论,我将数据集的所有路径设为绝对路径(这些仅在文件内部,不依赖于文件的存储位置在硬盘驱动器上),同时我保持 文件路径相对 。
import h5py
import numpy as np
myfile = h5py.File('test_a.hdf5', 'w')
myfile['/path/to/data'] = np.array([0,1,2])
myfile.close()
myfile = h5py.File('test_b.hdf5', 'w')
myfile['/path/to/data'] = np.array([3,4,5])
myfile.close()
myfile = h5py.File('test.hdf5', 'w')
myfile['/a'] = h5py.ExternalLink('test_a.hdf5', '/path/to/data')
myfile['/b'] = h5py.ExternalLink('test_b.hdf5', '/path/to/data')
myfile.close()
myfile = h5py.File('test.hdf5', 'r')
keys = list(myfile.keys())
print(keys)
print(list(myfile[keys[0]]))
print(list(myfile[keys[1]]))
myfile.close()
打印(如预期):
['a', 'b']
[0, 1, 2]
[3, 4, 5]
最近我开始使用 .hdf5
个文件,但仍然不知道如何正确使用外部链接。
我有几个 .hdf5
文件。每个文件都有相同的结构,例如相同的键和数据类型。我想将它们合并到一个文件中,但将它们分开,每个文件使用不同的密钥。
这是我的做法:
myfile = h5py.File("/path_to_the_directory/merged_images.hdf5", 'w')
myfile['0.000'] = h5py.ExternalLink("img_000.hdf5", "/path_to_the_directory/images")
myfile['0.001'] = h5py.ExternalLink("img_001.hdf5", "/path_to_the_directory/images")
myfile.flush()
然后我尝试阅读它:
myfile = h5py.File("/path_to_the_directory/merged_images.hdf5", 'r')
keys = list(myfile.keys())
print(keys)
print(list(myfile[keys[0]]))
行 print(keys)
给了我 ['0.000', '0.001']
。所以,我相信文件的结构没问题。
接下来的几行给了我一个例外:
KeyError: "Unable to open object (unable to open external file, external link file name = 'img_000.hdf5')"
我是不是做错了什么?文档很差,我没有 在那里找不到相关的用例。
问题是您混淆了路径。区分两种类型的路径很重要:
- 文件路径(硬盘上的位置)。
- 数据集路径:此路径是 HDF5 文件的内部路径,不取决于您存储文件的位置。
h5py.ExternalLink
的语法,如the documentation所述,是:
myfile['/path/of/link'] = h5py.ExternalLink('/path/to/file.hdf5', '/path/to/dataset')
Thereby I would like to encourage you to use a relative file path for the
ExternalLink
. If you do that, then everything will continue to work even if you move the collection of files to a new location on your hard drive (or give them to somebody else).
使用正确的路径,您的示例可以正常工作,如下所示。
请注意,为了说明我对相对文件路径的评论,我将数据集的所有路径设为绝对路径(这些仅在文件内部,不依赖于文件的存储位置在硬盘驱动器上),同时我保持 文件路径相对 。
import h5py
import numpy as np
myfile = h5py.File('test_a.hdf5', 'w')
myfile['/path/to/data'] = np.array([0,1,2])
myfile.close()
myfile = h5py.File('test_b.hdf5', 'w')
myfile['/path/to/data'] = np.array([3,4,5])
myfile.close()
myfile = h5py.File('test.hdf5', 'w')
myfile['/a'] = h5py.ExternalLink('test_a.hdf5', '/path/to/data')
myfile['/b'] = h5py.ExternalLink('test_b.hdf5', '/path/to/data')
myfile.close()
myfile = h5py.File('test.hdf5', 'r')
keys = list(myfile.keys())
print(keys)
print(list(myfile[keys[0]]))
print(list(myfile[keys[1]]))
myfile.close()
打印(如预期):
['a', 'b']
[0, 1, 2]
[3, 4, 5]