如何在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
相关产品推荐
相关产品推荐

