You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python文件指定行插入代码行?Terraform Lambda场景

解决方案:将生成的Payload插入到main.py指定位置

原代码的问题在于使用r+模式读写文件时,读取完文件后指针会停在末尾,导致写入的内容被追加到文件最后。要实现在url定义行之后插入内容,更可靠的方式是将文件内容全部读入内存,修改后再整体写入。

以下是修改后的完整代码:

import zipfile

# 解压文件到temp文件夹
with zipfile.ZipFile("Archive.zip", 'r') as zip_ref:
    zip_ref.extractall("temp")

# 读取main.py并删除原有payload_开头的行
with open("temp/main.py", "r") as f:
    lines = f.readlines()

# 过滤掉payload_开头的行,同时保留其他内容
filtered_lines = [line for line in lines if not line.lstrip().startswith("payload_")]

# 读取conditions.txt生成新的payload行
new_payload_lines = []
with open("conditions.txt", "r") as f:
    for index, condition in enumerate(f.readlines(), start=1):
        condition = condition.replace(",", "").strip()
        if not condition:  # 跳过空行
            continue
        payload_line = f'payload_{index}="{{\\"query\\":\\"mutation {{\\\\n    alertsNrqlConditionStaticUpdate(id: {condition}, accountId: 11111111, condition: {{\\\\n        enabled : true\\\\n      }}) {{\\\\n        name\\\\n    }}\\\\n}}\\\\n\\",\\"variables\\":{{}}}}"\n'
        new_payload_lines.append(payload_line)

# 找到url行的位置,插入新的payload行
for idx, line in enumerate(filtered_lines):
    if line.strip().startswith("url ="):
        # 在url行的下一行插入空行(和原格式保持一致)
        filtered_lines.insert(idx + 1, "\n")
        # 插入所有payload行
        filtered_lines[idx + 2:idx + 2] = new_payload_lines
        break

# 将修改后的内容写入main.py
with open("temp/main.py", "w") as f:
    f.writelines(filtered_lines)

关键修改说明

  • 内存中修改内容:不再使用r+模式边读边写,而是先将所有行读入列表,修改后一次性写入,彻底避免指针位置问题。
  • 精准定位插入位置:遍历过滤后的行,用strip()处理后匹配url =开头的行,确保不受行首空格影响,在其下一行插入空行和所有新payload行,和原文件格式对齐。
  • 鲁棒性优化:读取conditions.txt时跳过空行,避免生成无效的payload变量。
  • 代码简化:用列表推导式过滤旧payload行,用enumerate(start=1)直接生成从1开始的索引,简化代码逻辑。

内容的提问来源于stack exchange,提问作者Naxxio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 15:10:26