本文介绍如何在 python 中完全替代 shell 调用 awk,通过 `csv` 模块安全解析竖线(|)分隔文件,并动态插入变量(如年份 yy),避免字符串格式化错误与 shell 注入风险。
在将 Bash 脚本迁移到 Python 时,一个常见误区是仍依赖 os.system() 或 subprocess 拼接 Shell 命令——这不仅易出错(如你遇到的 TypeError: not all arguments converted during string formatting),还存在路径注入、特殊字符转义、跨平台兼容性等隐患。更稳健、更 Pythonic 的方式是:直接在 Python 内完成数据解析与转换。
上述问题中,目标是从 | 分隔的文本中提取满足 $2 ~ /R1/(即第 3 列含 "R1")的行,并拼接 yy + 第4列 + "XA"(注意:awk 中 $2 对应 Python 的 row[2],因索引从 0 开始)。原始 Shell 命令逻辑清晰,但 Python 字符串插值未正确转义,导致格式化失败。
✅ 推荐解决方案:使用 csv.reader 显式指定分隔符,配合上下文管理器安全读写:
import csv
def awkfst(inname, yy, outname):
with open(inname, 'r', encoding='utf-8') as infile, \
open(outname, 'w', encoding='utf-8') as outfile:
reader = csv.reader(infile, delimiter='|', skipinitialspace=True)
for row in reader:
# 防御性检查:确保至少有 4 列(索引 0–3),且第3列(即 $2)存在 "R1"
if len(row) >= 4 and 'R1' in row[2]:
# 拼接 yy(整数)、第4列(row[3])、固定字符串 "XA",并换行
outfile.write(f'{yy}{row[3].strip()}XA\n')? 关键说明:
⚠️ 注意事项:
总结:与其费力调试 Shell 字符串拼接,不如拥抱 Python 的标准库。csv 模块专为结构
化文本设计,配合 with 语句和类型安全的字符串格式化,代码更健壮、可读性更高、维护成本更低——这才是生产环境推荐的迁移路径。