如何将字符串作为变量名赋值传递

How to pass string as variable name assignment

我有一个 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

您可以使用 eval 从 Python 中的字符串计算表达式。这是一个简单的例子:

>>> x = 123
>>> y = "x"
>>> z = eval(y)
>>> 
>>> print z
123

对于你的情况,你可以这样做:

electronDensity = eval(vName)

使用 vars without argument, you can access local variables as a dictionary. Or you can also use globals or locals.

getattr混合使用属性名称获取任意属性:

vs = vName.split('.')
varname = vs.pop(0)
value = vars()[varname]
for v in vs:
   value = getattr(value, v)

electronDensity = value

感谢您的回答。我做了以下并且它起作用了。 这样,即使我不知道在每个模拟 运行 中创建的变量是什么,我的 post-processing python-脚本也会处理 [=] 处动态创建的变量17=]模拟时间。

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])        

再次感谢。