我有一个SDF数据文件,它以块格式存储变量名称及其值。
varNameList
旁边的值是变量(字符串)的名称,对应于sdf文件中的数据块,只能通过给出这些变量名来访问它。
我使用ipython中的以下代码读取数据文件和变量
import sdf
import numpy as np
dataFile = sdf.read('0010.sdf')
varNameList = dir(dataFile)
varSize = np.size(varNameList) #gives the array size
vName = 'dataFile.'+np.str(varNameList[51])+'.data'
变量名称的输出如下:
In [71]:varNameList[51]
Derived_Number_Density_electron
In [72]:vName
'dataFile.Derived_Number_Density_electron.data'
现在,我希望在作业的右侧使用此字符串,例如
electronDensity = dataFile.Derived_Number_Density_electron.data
如果我在标准Python程序中编写此行,它会读取数据并将其分配给electronDensity。
但是,在我的模拟中,这些变量是动态创建的,并且可以使用上面所写的dir()
命令找到它们的名称。我无法创建相当于
electronDensity = dataFile.Derived_Number_Density_electron.data
答案 0 :(得分:1)
您可以使用eval
来评估Python中字符串的表达式。这是一个简单的例子:
>>> x = 123
>>> y = "x"
>>> z = eval(y)
>>>
>>> print z
123
在您的情况下,您可以这样做:
electronDensity = eval(vName)
答案 1 :(得分:0)
使用不带参数的https://fortawesome.github.io/Font-Awesome/examples/,可以将本地变量作为字典访问。或者您也可以使用vars
或globals
。
使用locals
混合以使用属性名称获取任意属性:
vs = vName.split('.')
varname = vs.pop(0)
value = vars()[varname]
for v in vs:
value = getattr(value, v)
electronDensity = value
答案 2 :(得分:0)
感谢您的回答。我做了以下工作。 这样,即使我不知道在每次模拟运行中创建的vaiables是什么,我的后处理python脚本将在模拟运行时处理动态创建的变量。
path = '/home/ajit/run/data/0001.sdf'
datafile=sdf.read(path)
varNameList = dir(datafile) #reads all the variable names
varNameSize = np.size(varNameList)
varName=[0 for i in range(varNameSize]
varData=[0 for i in range(varNameSize]
for i in range (0, varNameSize):
varName[i] = 'q.'+np.str(varNameList[i])+'.data'
varData[i] = eval(varName[i])
再次感谢。