如何批量替换列表中环境变量的符号格式?
需求与解决方案
问题描述
需要处理一个动态变化的列表,列表元素可能包含Windows风格环境变量(带%符号),例如:
a = ['C:\\Temp\\Folder1', 'C:\\Temp\\Folder2', 'C:\\Temp\\Folder3', 'C:\\Temp\\Folder4', '%ALLUSERSPROFILE%\\Temp', '%WINDIR%\\Temp']
要求将所有带%的元素转换为${小写变量名}格式,处理后结果如下:
a = ['C:\\Temp\\Folder1', 'C:\\Temp\\Folder2', 'C:\\Temp\\Folder3', 'C:\\Temp\\Folder4', '${allusersprofile}\\Temp', '${windir}\\Temp']
需确保所有符合条件的元素都被处理,同时要给每个路径末尾添加反斜杠以适配API要求。
代码迭代过程
编辑1:初次尝试(未达预期)
最初尝试使用正则替换,但未正确更新列表元素,导致替换无效。代码片段如下:
# 导入模块 import requests, json, os, re # 用于识别文件夹例外的正则模式 var_pattern = re.compile(r"%([^%]+)%") # 替换环境变量中%符号的函数 def process_var_sub(match): var_name = match.group(1) return "${" + var_name.lower() + "}" # 写入文件夹例外的函数 def write_folder_exception_list(excluded_folder_list, policy_name, section): if len(excluded_folder_list): for p in excluded_folder_list: # 此处错误:正则替换返回新字符串,但未赋值回列表 var_pattern.sub(process_var_sub, p) for i in range(len(excluded_folder_list)): excluded_folder_list[i] = excluded_folder_list[i] + "\\" excluded_folder_list = { 'name': policy_name + " "+section+" Exclusions", 'description': "", 'items': excluded_folder_list } payload = json.dumps(excluded_folder_list, indent=4) print(payload) url = baseurl + "directorylists" response = requests.request("POST", url, headers=headers, data=payload) print(response.text) del response del url del excluded_folder_list del payload else: return
核心问题:var_pattern.sub()返回替换后的新字符串,但没有将结果赋值回原列表,导致替换操作未生效。
编辑2:临时解决方案
通过列表推导式生成替换后的新列表,实现了功能,但存在循环冗余问题:
def write_folder_exception_list(excluded_folder_list, policy_name, section): if len(excluded_folder_list): for i in range(len(excluded_folder_list)): # 每次循环都重新生成整个替换后的列表,冗余低效 excluded_folder_list_cleaned = [ var_pattern.sub(process_var_sub, p) for p in excluded_folder_list ] excluded_folder_list = excluded_folder_list_cleaned excluded_folder_list[i] = excluded_folder_list[i] + "\\" excluded_folder_list = { 'name': policy_name + " "+section+" Exclusions", 'description': "", 'items': excluded_folder_list_cleaned } payload = json.dumps(excluded_folder_list, indent=4) print(payload)
核心问题:循环内重复生成替换后的列表,造成不必要的性能损耗。
编辑3:优化后的完整实现
结合建议优化代码,将替换和添加反斜杠合并到一次列表推导中,同时完善了从JSON文件读取配置、调用API提交的完整流程:
# 用于识别文件夹例外的正则模式 var_pattern = re.compile(r"%([^%]+)%") # 替换Apex One环境变量中%符号的函数 def process_var_sub(match): var_name = match.group(1) return "${" + var_name.lower() + "}" # 从JSON文件中填充元素 def populate_elements(policy_filename): with open(policy_filename) as jsonFile: # 打开JSON文件 data = json.load(jsonFile) # 读取文件内容 policyname = data['policy'][0]['policyName'] # 获取Apex One中显示的策略名称 dictionary = data['policy'][0]['managedSettings'] # 读取存储用户自定义数据的managedSettings段 settings = json.loads(dictionary) # 将settings作为独立JSON字符串读取 return policyname, [settings] # 使用API写入文件夹例外的函数 def write_folder_exception_list(excluded_folder_list, policy_name, section): if len(excluded_folder_list): # 一次完成替换和添加反斜杠,避免冗余循环 cleaned_list = [ var_pattern.sub(process_var_sub, path) + "\\" for path in excluded_folder_list ] excluded_folder_list = { 'name': f"{policy_name} {section} Exclusions", 'description': "", 'items': cleaned_list } payload = json.dumps(excluded_folder_list, indent=4) url = baseurl + "directorylists" response = requests.request("POST", url, headers=headers, data=payload) print(response.text) else: return # 打开脚本运行目录下的JSON策略文件 for file in os.listdir(): # 获取目录中的文件列表 policy_filename = os.fsdecode(file) # 获取文件名 if policy_filename.endswith(".policy"): # 仅处理.policy文件 policyName, settings = populate_elements(policy_filename) # 调用函数填充managed_settings信息 for settings in settings: # 遍历settings以填充字段 # RTS排除项 RTSExcludedFolders = settings["managed_settings"][0]["settings"][1]["value"]['ExcludedFolder'] RTSExcludedFiles = settings["managed_settings"][0]["settings"][3]["value"]['ExcludedFile'] RTSExcludedExtensions = settings["managed_settings"][0]["settings"][5]["value"]['ExcludedExt'] write_folder_exception_list(RTSExcludedFolders, policyName, "RTS Scan") write_extensions_exception_list(RTSExcludedExtensions, policyName, "RTS Scan") write_filename_exception_list(RTSExcludedFiles, policyName, "RTS Scan")
优化点:
- 将替换和添加反斜杠合并为一次列表推导,避免重复遍历,提升执行效率
- 使用f-string简化字符串拼接,代码更易读
- 移除不必要的手动变量删除操作,Python会自动管理内存回收
内容的提问来源于stack exchange,提问作者OverSeer
相关产品推荐
相关产品推荐

