Pythonic修改for循环的方法

时间:2017-03-24 10:58:48

标签: python for-loop

我在实验室中使用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()

1 个答案:

答案 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?