将数据帧单元格作为变量传递



我有以下输入CSV文件:

prefix_files = 'wave6results_'
op2file= 'TRAM.op2'
fmin= 11
fmax= 20
df= 3.0
bemsurface= ['PCOMP PID_260002', 'PCOMP PID_260003', 'PCOMP PID_260004', 'PCOMP PID_260005', 'PCOMP PID_260006', 'PCOMP PID_260016', 'PCOMP PID_260026']
meshsize= 0.07  
areathreshold= 0.02
dafspectra= [134.7, 138.2, 142.0, 140.6, 135.1, 129.0, 124.5, 120.7, 117.7, 0]
dlf= [0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02]
output_acc= 1    
name_acc= ['Capteurs Coque', 'Capteurs Backing Structure']

ranges_acc= [[100000, 100999],[600000, 600999]]
output_force=  1
name_force= ['SPC set10']
output_cons= 1
name_cons= 'FePID'
FePID_cons= [260002, 260003, 260004, 260005, 260006, 260016, 260026, 460006, 464800, 464801, 466200, 470006, 474800, 474801, 476200, 480000, 480001, 480200, 480240, 490300, 496301, 527001, 527002, 600300, 610000, 620200, 620350, 620550, 630200, 700800, 800000, 800001, 820000, 821000]

正如你所猜测的,我想将它们传递到我的Python脚本中,例如,变量bemsurface是一个由所有"PCOMP PID…"组成的列表你可以在我的CSV摘录的第一行看到。

我相信获得这些变量的最简单方法是通过panda,所以我编码了这样的代码:

from pathlib import Path
import pandas as pd
path_csv = Path('CreateModel_input_test.csv')
input_values = pd.read_csv(path_csv, names = ['variables','values'], delimiter='=')

这给了我一个很好的数据框架,其中一列是我想要的变量的名称,另一列是它们的值。

1                2
0   prefix_files     'wave6results_'
1   op2file          'TRAM.op2'
2   fmin             11
3   fmax             20
4   df               3.0
5   bemsurface       ["PCOMP PID_260002", "PCOMP PID_260003", "PCOMP PID_260004", "PCOMP PID_260005", "PCOMP PID_260006", "PCOMP PID_260016", "PCOMP PID_260026"]
6   meshsize         0.07 

现在我知道要不惜一切代价避免eval((函数,那么如何遍历数据帧并将右侧的值分配给从左列命名的变量呢?

提前感谢您的帮助:(

如果您想使用panda和这种配置文件,请使用globals()ast.literal_eval()的解决方案:

from ast import literal_eval
import pandas as pd
df = pd.DataFrame({"0": ["test_var"], "1": ["['a', 'b', 'c', 545.5]"]})
for i, row in df.iterrows():
globals()[row[0]] = literal_eval(row[1])

print(test_var)

但是,它既不是一个有效的解决方案,也不是一个安全的解决方案(如果一个变量的名称像内置的一样呢?(。我推荐使用json格式的更健壮的方法:

config.json

{
'prefix_files': 'wave6results',
'bemsurface': ['PCOMP PID_260002', 'PCOMP PID_260003', 'PCOMP PID_260004', 'PCOMP PID_260005', 'PCOMP PID_260006', 'PCOMP PID_260016', 'PCOMP PID_260026']
}

script.py

import json
with open("config.json") as file:
config = json.load(file)
# Access
print(config['bemsurface'])

这样更安全、更标准。

就我个人而言,我会把它们放在字典里。

input_values.to_dict()

然后从那里引用。

你可以尝试将它们添加到本地环境中,比如locals().update(input_values),但我不鼓励这样做

最新更新