将数据框单元格作为变量传递
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'])
这样更安全也更规范
我有以下输入 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'])
这样更安全也更规范