У меня есть файл данных 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
3 ответа
Вы можете использовать eval
для вычисления выражения из строки в Python. Вот простой пример:
>>> x = 123
>>> y = "x"
>>> z = eval(y)
>>>
>>> print z
123
В вашем случае вы можете:
electronDensity = eval(vName)
Спасибо за ответы. Я сделал следующее, и это сработало. Таким образом, даже если я не знаю, какие переменные создаются в каждом прогоне моделирования, мой 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])
Еще раз спасибо.
Используя vars
без аргументов, вы можете получить доступ к локальным переменным как словарь. Или вы также можете использовать globals
или locals
.
Смешивание с getattr
для получения произвольного атрибута с использованием имени атрибута:
vs = vName.split('.')
varname = vs.pop(0)
value = vars()[varname]
for v in vs:
value = getattr(value, v)
electronDensity = value
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.