【发布时间】:2017-08-17 06:54:42
【问题描述】:
我在实验室中使用 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()
【问题讨论】:
-
除非我们知道 v_source 是什么,否则代码实际上没有意义,因为您的第一个代码 sn-p 每次迭代都会用 v 覆盖 v_source.voltage。 v_source 是否应该在循环的每次迭代中都不同?
-
v_source和i_probe是代表物理仪器的对象。v_source.voltage将设置仪器的电压,i_probe.current从仪器读取电流。仪器在每次迭代中都保持不变(因此v_source),但其输出电压会发生变化(因此v_source.voltage)。 (编辑原始帖子以更清楚地反映这一点)