如何将Python2.7+空字段名format代码转换为2.6兼容的索引字段格式
批量修复Python 2.6 format零长度字段名报错的方案
- 编辑器正则替换(适合少量文件)
单占位符场景直接查找{}替换为{0};带格式的空占位符如{:.2f},查找{:([^}]*)}替换为{0:\1}即可。多占位符场景可使用编辑器的计数替换功能,或直接用后续的脚本方法。 - sed命令批量替换(适合单占位符占绝大多数的项目)
项目根目录执行以下两行命令,批量替换所有.py文件中的空占位符:
注意:该方法会替换所有匹配的{},如果存在多参数format或非format场景的{}(如正则、JSON字符串),可能出现误改,需要后续手动校验。# 替换无格式的空占位符 find . -name "*.py" -exec sed -i 's/{}/{0}/g' {} \; # 替换带格式的空占位符 find . -name "*.py" -exec sed -i 's/{:\([^}]*\)}/{0:\1}/g' {} \; - Python脚本精准替换(适合复杂场景)
以下脚本可自动识别format调用的空占位符数量,按顺序添加索引,准确率更高:
把代码保存为import re import os import sys def replace_brackets(s): pattern = re.compile(r'{(:[^}]*)?}') cnt = [0] def do_replace(match): res = f"{{{cnt[0]}{match.group(1) or ''}}}" cnt[0] += 1 return res return pattern.sub(do_replace, s) def process_py_file(path): try: with open(path, 'r', encoding='utf-8') as f: content = f.read() new_content = re.sub( r'([\'"])(.*?)\1\.format', lambda m: f"{m.group(1)}{replace_brackets(m.group(2))}{m.group(1)}.format", content ) if new_content != content: with open(path, 'w', encoding='utf-8') as f: f.write(new_content) print(f"已修复: {path}") except: print(f"处理失败: {path}") if __name__ == "__main__": root = sys.argv[1] if len(sys.argv) > 1 else "." for dirpath, _, filenames in os.walk(root): for name in filenames: if name.endswith(".py"): process_py_file(os.path.join(dirpath, name))fix_format.py,放在项目根目录执行python fix_format.py即可自动完成所有文件的修复。 - 所有修复完成后,建议通过版本工具对比修改内容,排除非format场景的误改,确认无误后再运行代码验证功能。
内容的提问来源于stack exchange,提问作者tomocafe
相关产品推荐
相关产品推荐

