如何将Python print函数输出的数组内容打印为单行格式
问题描述
当前用Python的print函数输出内容如下:
'name': 'testfail2222', 'tags': ['customer:google', 'probe_dc:aws:us-west-1', 'check_type:api', 'check_status:paused', 'ci_execution_rule:non_blocking'],
期望将其格式化为单行输出:
'name': 'testfail2222', 'tags': ['customer:google','probe_dc:aws:us-west-1','check_type:api','check_status:paused','ci_execution_rule:non_blocking'],
用户采用先保存print输出到文件,再格式化文件内容的方式,已编写以下Python代码,需调整以实现需求:
import os, json, re, sys from itertools import islice from datadog_api_client import ApiClient, Configuration from datadog_api_client.v1.api.monitors_api import MonitorsApi configuration = Configuration() with ApiClient(configuration) as api_client: api_instance = MonitorsApi(api_client) response = api_instance.list_monitors( monitor_tags="check_status:paused" ) sourceFile = open('printoutput.json', 'w') print(response, file = sourceFile) sourceFile.close() with open('printoutput.json', "r") as input: with open("temp.json", "w") as output: # iterate all lines from file for line in input: # if substring contain in a line then don't write it if " 'name': '" not in line.strip("\n"): output.write(line) # replace file with original name os.replace('temp.json', 'printoutput.json') patrn = "'tags': [[\^[]]*]" word= "'name': " with open('printoutput.json','r') as file: for line in file: if word in line: print(line, end="", flush=True) if re.search(patrn, line): print(line, end="")
解决方案
现有代码绕了弯路,且正则表达式错误,直接从API响应处理更高效,不用先存文件再解析。以下是两种实现方式:
方法一:直接处理API响应(推荐)
跳过文件存储步骤,直接从返回的Python对象中提取字段,按要求格式输出:
import os, json, re, sys from datadog_api_client import ApiClient, Configuration from datadog_api_client.v1.api.monitors_api import MonitorsApi configuration = Configuration() with ApiClient(configuration) as api_client: api_instance = MonitorsApi(api_client) response = api_instance.list_monitors( monitor_tags="check_status:paused" ) # 遍历每个监控项(response为监控对象列表) for monitor in response: name = monitor.get('name', '') tags = monitor.get('tags', []) # 将tags列表格式化为单行字符串 tags_str = "['" + "','".join(tags) + "']" # 按目标格式输出 print(f"'name': '{name}', ") print(f"'tags': {tags_str},")
方法二:通过文件处理(若坚持原有流程)
修复正则和处理逻辑,重新实现文件格式化:
import os, re from datadog_api_client import ApiClient, Configuration from datadog_api_client.v1.api.monitors_api import MonitorsApi configuration = Configuration() with ApiClient(configuration) as api_client: api_instance = MonitorsApi(api_client) response = api_instance.list_monitors( monitor_tags="check_status:paused" ) # 保存响应到文件 with open('printoutput.json', 'w') as sourceFile: print(response, file=sourceFile) # 读取文件并格式化 with open('printoutput.json', 'r') as input_file, open('formatted_output.txt', 'w') as output_file: in_tags_block = False tags_lines = [] for line in input_file: stripped_line = line.strip() # 匹配name行并输出 if "'name': '" in stripped_line: output_file.write(f"{stripped_line}, \n") # 匹配tags起始行,开始收集tags elif "'tags': [" in stripped_line: in_tags_block = True first_tag = stripped_line.split('[', 1)[1].rstrip(',') tags_lines.append(first_tag) # 匹配tags结束行,拼接输出 elif in_tags_block and '],' in stripped_line: in_tags_block = False last_tag = stripped_line.lstrip().rstrip('],') tags_lines.append(last_tag) # 清理标签内容并拼接成单行 cleaned_tags = [t.strip().strip("'") for t in tags_lines] tags_str = "['" + "','".join(cleaned_tags) + "']" output_file.write(f"'tags': {tags_str},\n") # 收集tags中间行 elif in_tags_block: tag = stripped_line.rstrip(',') tags_lines.append(tag) # 替换原文件(可选) os.replace('formatted_output.txt', 'printoutput.json') # 打印最终结果 with open('printoutput.json', 'r') as file: print(file.read())
关键修改说明
- 正则修正:原正则表达式完全错误,改为通过行匹配识别tags块,更可靠易维护。
- 直接处理响应:API返回的
response是Python对象(列表/字典),直接提取字段比解析字符串文件效率高,避免格式解析问题。 - tags格式化:用
"','".join(tags)快速将列表元素拼接成逗号分隔的字符串,再包裹方括号和单引号,直接得到单行格式。
内容的提问来源于stack exchange,提问作者Rishav Bagga
相关产品推荐
相关产品推荐

