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

标签 python pandas eval

我有以下输入 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 是一个由您在 CSV 摘录的第一行中看到的所有“PCOMP PID...”组成的列表.

我相信获取这些变量的最简单方法是通过 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() 函数,那么您将如何遍历数据框并将右侧的值分配给左列中命名的变量?

提前感谢您的帮助:)

最佳答案

如果您想使用 pandas 和此类配置文件,则使用 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']
}

脚本.py

import json

with open("config.json") as file:
   config = json.load(file)

# Access
print(config['bemsurface'])

这样更安全、更标准。

关于python - 将数据框单元格作为变量传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68496342/

相关文章:

python - 如何获取 Pandas 数据框列的最大值并在另一列中找到相应的值?

perl - 我怎样才能避免在 Perl 中使用 "eval"?

ruby - 为什么我不能在初始化中使用 attr_accessor?

python - 为什么类定义的元类关键字参数接受可调用对象?

python - 如何将字符串拆分为单词列表?

Python Pandas - 使用字典列在数据框中附加/更新键值对

javascript - 使用 eval() 定义 const 变量

python - 对于 int __pow__ int 的 python 类型提示,如何修复 mypy 错误 "Expression has type Any [misc]"?

python - 如何在 Python 中获取 mmap-ed 内存的地址?

python-3.x - 将地理区域划分为大小相等的网格并检索索引位置