Python中如何将列表读取的字符串作为已定义变量名使用
解决方案
你读取文件得到的csv_name_1是字符串类型,Python不会自动将字符串和代码中定义的同名变量做关联,你可以用以下两种方法解决:
方案1:预建变量映射表(推荐,安全度最高)
提前把所有已定义的csv文件名变量存入一个映射字典,后续直接用读取到的字符串作为key取对应变量值即可,完全避免执行风险。
示例代码:
# 预定义变量 csv_name_1 = "%s/gpdb_%s.csv" % (tmp_dir, today_wo_clock) csv_name_2 = "%s/gpdb_aa_%s.csv" % (tmp_dir, today_wo_clock) # 新增映射字典 csv_name_map = { "csv_name_1": csv_name_1, "csv_name_2": csv_name_2 } lookup = 'csv_name_' with open('Excel_Mapping.txt') as myFile: for num, line in enumerate(myFile, 1): if lookup in line: data = line.strip().split(sep=',') # 加strip去除换行符等空白字符 if len(data) >= 8: lov = data row = { # 从映射表取对应的变量值 'csv_name': csv_name_map[lov[0]], 'col1_name': lov[1], 'col1_val': lov[2], 'col2_name': lov[3], 'col2_val': lov[4], 'col3_name': lov[5], 'col3_val': int(lov[6]), 'result_col_name': lov[7], 'sanity_excel_name': sanity_excel_name, 'row': num }
方案2:调用全局变量字典(仅适合文件内容完全可控的场景)
如果你的Excel_Mapping.txt内容完全可信,不会出现恶意构造的字段,可以直接用Python内置的globals()方法获取全局变量字典,用读取到的字符串作为key取值:
只需要把你代码里给csv_name赋值的部分改成如下即可:
'csv_name': globals()[lov[0]]
注意:该方法存在安全风险,如果文件中被写入恶意字符串,可能会执行非预期代码,非必要不推荐使用。
内容的提问来源于stack exchange,提问作者Evgeny_Kiselgof
相关产品推荐
相关产品推荐

