如何将字符串作为变量名赋值传递
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])
再次感谢。
我有一个 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])
再次感谢。