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

Pass dataframe cells as variables

我有以下输入 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 提取。

我相信获取这些变量的最简单方法是通过 pandas,所以我编写了如下代码:

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() 函数,那么您将如何遍历数据框并将右侧的值分配给左侧列中命名的变量?

提前感谢您的帮助:)

就我个人而言,我会将它们保存在字典中。

input_values.to_dict()

然后从那里参考。

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

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

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'])

这样更安全也更规范