Python3处理字典数据时如何去除\u001b[0m这类特殊字符
问题场景
Python3开发场景下,将bash命令的输出字符串转换为结构化字典数据时,结果中混入了需要移除的ANSI转义特殊字符,无法得到预期的干净结构化数据。
原有实现代码
bashCommand = "some bash command" stdoutdata = subprocess.getoutput(bashCommand) lines = stdoutdata.splitlines() result = {"data": []} for line in lines: line = line.rstrip() entry = line.split(":") result["data"].append({"{#NAME}":entry[0],"{#STATUS}": entry[1]}) print(json.dumps(result))
预期bash原始输出
GENERAL-1 : UP GENERAL-2 : UP GENERAL-3 : UP
实际异常返回结果
{"data": [{"{#NAME}": "GENERAL-1", "{#STATUS}": " UP\u001b[0m"}, {"{#NAME}": "GENERAL-2", "{#STATUS}": " UP\u001b[0m"}, {"{#NAME}": "GENERAL-3", "{#STATUS}": " UP\u001b[0m"}]}
原因说明
\u001b[0m是终端输出的ANSI颜色控制转义字符,本质是被调用的bash命令默认开启彩色输出,执行返回结果时将终端颜色控制符一并带回了输出流。
解决方法
可根据实际场景二选一:
方案1:源头禁用彩色输出
调用bash命令时通过环境变量强制指定哑终端,或给命令追加关闭彩色输出的参数,从根源避免特殊字符生成:
# 通用方案:命令前加环境变量强制非彩色输出,适配绝大多数带彩色输出的命令 bashCommand = "TERM=dumb some bash command" # 若命令本身支持关闭颜色参数,也可直接追加,例如grep、ls类命令 # bashCommand = "some bash command --color=never" stdoutdata = subprocess.getoutput(bashCommand)
方案2:代码层过滤转义字符
如果不方便修改执行的bash命令,可直接通过正则匹配清除所有ANSI转义序列,同时优化原有代码的字段空格问题、空行越界问题:
import re import subprocess import json # 预编译ANSI转义字符匹配正则 ansi_escape = re.compile(r'\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])') bashCommand = "some bash command" stdoutdata = subprocess.getoutput(bashCommand) # 统一清除所有ANSI控制字符 stdoutdata = ansi_escape.sub('', stdoutdata) lines = stdoutdata.splitlines() result = {"data": []} for line in lines: line = line.rstrip() if not line: # 跳过空行避免索引报错 continue entry = line.split(":") result["data"].append({ "{#NAME}": entry[0].strip(), "{#STATUS}": entry[1].strip() }) print(json.dumps(result))
处理后最终输出结果为:
{"data": [{"{#NAME}": "GENERAL-1", "{#STATUS}": "UP"}, {"{#NAME}": "GENERAL-2", "{#STATUS}": "UP"}, {"{#NAME}": "GENERAL-3", "{#STATUS}": "UP"}]}
内容的提问来源于stack exchange,提问作者gsr
相关产品推荐
相关产品推荐

