如何将字符串作为变量名进行赋值

5
我有一个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
3个回答

2
你可以使用Python的eval函数来计算一个字符串表达式的值。下面是一个简单的示例:
>>> x = 123
>>> y = "x"
>>> z = eval(y)
>>> 
>>> print z
123

在您的情况下,您可以执行以下操作:
electronDensity = eval(vName)

1
eval()非常危险! - Remi Guan

0

使用不带参数的vars,您可以将本地变量作为字典访问。或者您也可以使用globalslocals

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

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

electronDensity = value

0
感谢您的回答。我按照以下步骤操作,它起作用了。 这样,即使我不知道在每次模拟运行中创建了哪些变量,我的后处理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])        

再次感谢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接