我正在对hdf5文件中包含的大量变量进行数据分析。我编写的代码循环遍历变量列表,然后执行分析并输出一些图形。能够将代码用于变量组合(例如A+B
或sqrt((A**2)+(B**2)
)而不必放入一堆if语句,即在加载时在字符串中执行语句,这将是很好的。来自我的hdf5文件的变量。如果可能的话,我想避免使用pandas
,但我并不完全反对它,如果这是我想要的唯一有效方式。
我的hdf5文件看起来像这样:
HDF5 "blahblah.hdf5" {
FILE_CONTENTS {
group /
group /all
dataset /all/blargle
dataset /all/blar
}
}
我想做的是这个(h5py
中不存在此功能,所以它有错误):
myfile = h5py.File('/myfile/blahblah.hdf5')
varlist = ['blargle', 'blar', 'blargle+blar']
savelist = [None]*len(varlist)
for ido, varname in enumerate(varlist):
savelist[ido] = myfile['all'][varname]
#would like to evaluate varname upon loading
答案 0 :(得分:0)
首先你必须问自己:我是否只在运行时或编程时才知道算术运算?
如果你现在已经知道了,只需用Python编写一个函数。
如果只在运行时知道它,则需要一个解析器。虽然有专门针对此的库(example),但Python本身已经是一个解析器。使用exec,您可以执行包含Python代码的字符串。
现在你需要定义的是特定语言的某种语法。你需要一些约定。您已经拥有它们,似乎您希望将myfile['all']['blargle+blar']
转换为myfile['all']['blargle']+myfile['all']['blar']
。为了让生活更轻松,我建议。
将数据集的名称放在括号中。
varlist = ['[blargle]', '[blar]', '[blargle]+[blar]', 'sqrt(([blargle]**2)+([blar]**2)']
然后只需用myfile['all'][name_in_brackets]
替换括号中的所有字词,然后使用exec
执行字符串。
import re
for ido, varname in enumerate(varlist):
term = re.sub(r'\[(.*?)\]', lambda x: "myfile['all']['{}']".format(x), varname, flag='g')
savelist[ido] = exec(term)
使用正则表达式匹配变量名re.sub的行实际上没有经过我测试。
还有一个缺点。我不确定从hdf5对象读取数据集是否很快,因为可以多次读取相同的数据集,如果hdf5没有缓存,那么在对它们进行计算之前中间存储数据集可能会更好。