У меня есть файл данных 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, она считывает данные и присваивает их электронной плотности.

Однако в моих симуляциях эти переменные создаются динамически, и их имена можно найти с помощью команды dir(), как написано выше. Я не могу создать строку программы, эквивалентную

electronDensity = dataFile.Derived_Number_Density_electron.data
4
Ajit Upadhyay 16 Дек 2015 в 07:55

3 ответа

Лучший ответ

Вы можете использовать eval для вычисления выражения из строки в Python. Вот простой пример:

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

В вашем случае вы можете:

electronDensity = eval(vName)
1
Tom Karzes 16 Дек 2015 в 05:02

Спасибо за ответы. Я сделал следующее, и это сработало. Таким образом, даже если я не знаю, какие переменные создаются в каждом прогоне моделирования, мой 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])        

Еще раз спасибо.

0
Ajit Upadhyay 18 Дек 2015 в 04:09

Используя vars без аргументов, вы можете получить доступ к локальным переменным как словарь. Или вы также можете использовать globals или locals.

Смешивание с getattr для получения произвольного атрибута с использованием имени атрибута:

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

electronDensity = value
0
falsetru 16 Дек 2015 в 05:34