【问题标题】:Pythonic way to modify a for loop修改 for 循环的 Pythonic 方法
【发布时间】: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_sourcei_probe 是代表物理仪器的对象。 v_source.voltage 将设置仪器的电压,i_probe.current 从仪器读取电流。仪器在每次迭代中都保持不变(因此v_source),但其输出电压会发生变化(因此v_source.voltage)。 (编辑原始帖子以更清楚地反映这一点)

标签: python for-loop


【解决方案1】:

没有看到代码很难看到,但基本上从它的外观来看,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?

【讨论】:

  • 但是你怎么知道目录的正确名称是什么?此名称取决于围绕create_dataset 命令的for 循环数以及该特定迭代的值。你还想看什么代码?
  • 有趣。从外观上看,目录名称完全取决于电压 v。因此,您需要在创建数据集文件中传递它才能执行上述操作。否则我认为这是不可能的,因为您缺少一条数据。
  • 我很害怕。由于数据最终在脚本中,我希望有一种方法可以做我想做的事。如果真的没有办法做到这一点,我不会感到惊讶。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-26
  • 2016-04-25
  • 1970-01-01
  • 2015-11-27
  • 2018-04-28
  • 2016-10-10
  • 1970-01-01
相关资源
最近更新 更多