我在实验室中使用python来控制测量。我经常发现自己循环一个值(比如电压),测量另一个(当前)并重复测量几次以便稍后对结果进行平均。由于我想保留所有测量数据,我喜欢立即将其写入磁盘并保持组织有序我使用hdf5文件格式。这种文件格式是分层的,这意味着它内部有一些使用Unix样式名称的目录结构(例如/
是文件的根目录)。组相当于目录,数据集或多或少等同于文件并包含实际数据。这种方法产生的代码类似于:
import h5py
hdf_file = h5py.File('data.h5', 'w')
for v in range(5):
group = hdf_file.create_group('/'+str(v))
v_source.voltage = v
for i in range(3):
group2 = group.create_group(str(i))
current = i_probe.current
group2.create_dataset('current', data = current)
hdf_file.close()
我已经编写了一个小型库来处理与实验室仪器的通信,我希望这个库能够自动将数据存储到文件中,而无需在脚本中明确指示这样做。我这样做的问题是,仍然需要在for循环的开头显式创建组(或者你喜欢的目录)。我想摆脱脚本中的所有文件处理代码,因此想要在for循环的每次迭代中自动写入新组的某种方式。实现这一目标的一种方法是以某种方式修改for
语句本身,但我不知道如何做到这一点。 for循环当然可以嵌套在更复杂的实验中。
理想情况下,我会留下以下内容:
import h5py
hdf_file = h5py.File('data.h5', 'w')
for v_source.voltage in range(5): # v_source.voltage=x sets the voltage of a physical device to x
for i in range(3):
current = i_probe.current # i_probe.current reads the current from a physical device
current_group.create_dataset('current', data = current)
hdf_file.close()
非常欢迎任何实现此解决方案的指针或同样可读的内容。
编辑:
下面的代码包括所有类定义等,可能会更好地了解我的意图。我正在寻找一种方法将所有文件IO移动到库(例如Instrument类)。
import h5py
class Instrument(object):
def __init__(self, address):
self.address = address
@property
def value(self):
print('getting value from {}'.format(self.address))
return 2 # dummy value instead of value read from instrument
@value.setter
def value(self, value):
print('setting value of {} to {}'.format(self.address, value))
source1 = Instrument('source1')
source2 = Instrument('source2')
probe = Instrument('probe')
hdf_file = h5py.File('data.h5', 'w')
for v in range(5):
source1.value = v
group = hdf_file.create_group('/'+str(v))
group.attrs['address'] = source1.address
for i in range(4):
source2.value = i
group2 = group.create_group(str(i))
group2.attrs['address'] = source2.address
group2.create_dataset('current', data = probe.value)
hdf_file.close()
答案 0 :(得分:0)
在没有看到代码的情况下很难看到,但基本上从它的外观来看,pythonic方法是每次添加新数据集时,都要检查目录是否存在,以及是否存在想要附加新数据集,如果不是,你想创建一个新目录 - 即这个问题可能会有所帮助
Writing to a new file if not exist, append to file if it do exist
而不是编写新文件,而是使用它来创建目录。另一个有用的可能是
How to check if a directory exists and create it if necessary?