一个专注于数据提取与重组的Python脚本工具

张开发
2026/4/16 11:40:37 15 分钟阅读

分享文章

一个专注于数据提取与重组的Python脚本工具
一、 功能概述一个专注于数据提取与重组的Python脚本工具。其核心使命是自动化地从一个名为results.json的源数据文件中批量提取出名为output的特定字段的值并将这些值重新封装到一个结构化的新文件outputs.json中。可以将其理解为数据流水线中的一个“字段提取器”​ 或“数据蒸馏器”。它解决了一个常见的数据处理痛点当从一个包含多维信息的复杂数据源results.json中只关心某一个特定维度的数据output字段用于后续分析、可视化或报告时手动复制粘贴效率低下且易出错。此脚本通过编程方式实现了该过程的批量化、自动化与标准化。核心功能拆解数据读取安全地读取并解析JSON格式的源文件./results.json。目标字段提取遍历源数据中的所有条目精准定位并收集每个条目下的output字段值。数据重组将收集到的所有output值按照预定义的新结构一个包含outputs键的字典进行封装。数据持久化将重组后的数据以格式化的JSON形式写入一个新的目标文件./outputs.json。状态反馈与错误处理在控制台输出操作结果如成功提取的数量或捕获并报告运行时可能出现的各种异常如文件不存在、格式错误等。二、 代码结构与执行流程分析程序采用经典的Python脚本结构清晰明了。入口与执行逻辑​ (if __name__ “__main__”:)这是Python模块的标准执行入口。它检查当前脚本是否被直接运行而非作为模块导入。当直接运行python tiqu.py时条件成立随即调用extract_outputs()函数启动整个提取流程。这种设计增强了代码的模块性使得extract_outputs函数既可以被独立脚本调用也可以在将来被其他模块导入和复用。核心函数​extract_outputs()这是脚本的“大脑”所有主要逻辑都封装在此函数内。函数内部采用了“尝试-异常try-except”的防御式编程结构确保了程序的健壮性。标准执行流无异常发生步骤1文件读取与解析with open(‘./results.json’, ‘r’, encoding‘utf-8’) as file:使用上下文管理器打开文件。这是一种最佳实践它能确保无论在代码块中是否发生异常文件都会被正确关闭避免资源泄漏。指定utf-8编码确保了其对多语言文本如中文的良好支持。data json.load(file)调用json模块的load函数将文件对象反序列化为Python原生数据结构通常是列表或字典。步骤2数据提取outputs_list [item.get(‘output’, ‘’) for item in data]这是整个脚本的算法核心。它使用列表推导式一种简洁高效的Python语法遍历data中的每一个item。对于每个item使用.get(‘output’, ‘’)方法安全地获取output键对应的值。如果键不存在则返回一个空字符串’’作为默认值防止程序因KeyError而崩溃。所有获取到的值被收集到一个新的列表outputs_list中。步骤3数据结构重组output_data {“outputs”: outputs_list}创建一个新的字典output_data。其唯一键是字符串“outputs”对应的值就是上一步中提取出的所有output值组成的列表。这个步骤完成了从原始结构到目标结构的转换。步骤4数据写入再次使用with open上下文管理器以写入模式 (‘w’) 打开或创建./outputs.json文件。json.dump(output_data, file, ensure_asciiFalse, indent2)将output_data字典序列化为JSON字符串并写入文件。ensure_asciiFalse允许非ASCII字符如中文直接以其原样如Unicode写入文件而不是被转义为\uXXXX的形式使得生成的文件对人类更可读。indent2使用2个空格进行缩进生成格式美观、具有层级结构的JSON文件便于人工查阅和调试。步骤5成功反馈print(f“成功提取 {len(outputs_list)} 个output字段到outputs.json文件”)使用f-string格式化字符串向用户报告成功信息并告知提取的具体数量提供了明确的操作反馈。异常处理流程​ (except块)程序预见了三种常见错误并按优先级从具体到一般进行捕获FileNotFoundError最可能发生的错误即源文件results.json不存在于指定路径。给出明确错误提示。json.JSONDecodeError源文件存在但其内容不符合JSON语法规范无法解析。同样给出明确提示。Exception as e这是一个“兜底”的异常捕获处理所有其他未预见的运行时错误。通过print(f“发生错误{e}”)打印具体的异常信息有助于高级调试。三、 数据结构设计本程序涉及两个核心数据结构输入的源数据结构和输出的目标数据结构。源数据results.json的假设结构从代码[item.get(‘output‘, ’’) for item in data]可以推断程序预期data是一个可迭代对象通常是一个列表list。列表中的每个item预期是一个字典dict。每个item字典中可能包含一个名为“output”的键。该键对应的值可以是任何JSON支持的类型如字符串、数字、布尔值、数组、对象等但根据程序上下文通常可能是字符串或数组。示例假设结构[ {id: 1, input: 问题A, output: 答案A, score: 0.95}, {id: 2, input: 问题B, output: 答案B, score: 0.87}, {id: 3, input: 问题C, score: 0.92}, // 此条目无output键 ... ]目标数据outputs.json的结构程序创建了一个全新的、高度聚焦的数据结构。它是一个字典仅包含一个键值对。键固定为字符串“outputs”。值一个列表其元素顺序与源数据data中的条目顺序严格一致。列表中每个元素就是对应源条目中output键的值。如果源条目中没有output键则对应位置是一个空字符串’’。承接上例生成的outputs.json内容为{ outputs: [答案A, 答案B, ] }这种结构极其简洁去除了所有无关字段使得下游应用可以毫无负担地直接使用outputs列表。四、 算法、编程思想与关键技术列表推导式这是Python中实现map和filter功能的精妙语法糖。[item.get(‘output‘, ’’) for item in data]一行代码等价于一个for循环但更简洁、执行效率也通常更高。它清晰地表达了“从一个集合中映射出另一个集合”的语义。防御性编程与健壮性设计异常处理全面的try-except块是程序稳定性的基石。它区分了不同类型的错误并提供了友好的用户提示避免了程序因外部因素文件缺失、格式错误而崩溃。安全的字典访问使用.get(key, default)方法而非直接通过item[‘output’]索引访问。这是处理可能存在缺失键的字典时的最佳实践避免了潜在的KeyError并通过提供默认值空字符串保证了输出列表长度的确定性和一致性。上下文管理器通过with open() as file:语句管理文件资源。这确保了即使在读写文件过程中发生异常文件也能被正确关闭资源得到及时释放避免了数据损坏或资源锁定的问题。数据序列化与反序列化熟练运用Python内置的json模块进行load从文件到对象和dump从对象到文件操作是实现程序与JSON文件这种通用数据格式交互的关键。函数式封装将主要逻辑封装在extract_outputs()函数中并通过if __name__ “__main__“:来调用体现了“模块化”的编程思想。这提高了代码的可读性、可测试性和可复用性。五、 潜在应用场景与扩展方向典型应用场景机器学习/AI实验日志处理results.json可能是一次模型批量推理的结果日志包含输入、模型输出、置信度分数等。本脚本用于单独提取所有“模型输出”用于后续的人工评估或自动评测。API响应批量提取当批量调用某个API并将所有响应保存到一个JSON文件后可以使用此脚本从每个响应体中提取出核心的output或data字段。数据清洗与预处理管道在ETL流程中作为中间环节从复杂的半结构化数据中抽取出所需的标准字段。报告生成从详细的原始数据中提取关键指标或结论生成一个简洁的数据源供图表生成工具使用。扩展与改进方向增强灵活性参数化通过命令行参数如argparse库或配置文件允许用户指定输入/输出文件路径、目标字段名不硬编码为output、默认值等。多字段提取扩展为可以同时提取多个指定字段并组织成更复杂的结构如列表套字典。提升性能对于非常大的JSON文件GB级别可以考虑使用ijson等流式解析库以迭代方式处理避免一次性加载全部数据到内存。增强功能过滤条件在提取时加入条件判断例如只提取score大于某阈值的output。数据转换在提取过程中对output值进行简单的清洗或转换如去除首尾空格、类型转换。增强鲁棒性与日志更精细的异常处理例如区分文件权限错误、磁盘空间不足等。使用logging模块替代print语句实现不同级别INFO, WARNING, ERROR的日志记录便于在后台长期运行或集成到系统中时进行监控。六、 代码质量与风格评估优点结构清晰函数封装和入口判断使代码结构良好。可读性强变量名具有描述性如outputs_list,output_data注释虽然简单但指明了关键部分。健壮性好全面的异常处理和安全的字典访问方法。符合规范使用上下文管理器、指定文件编码等符合Python编程的最佳实践。可考虑优化的点路径硬编码输入输出文件路径硬编码在代码中。在生产环境中建议通过参数或配置外部化。单一次任务当前脚本功能单一。虽然这是其设计目的但作为示例可以考虑提及如何扩展为更通用的工具。默认值选择使用空字符串’’作为缺失键的默认值。这在某些场景下是合理的但并非万能。如果output字段本身预期是数字或复杂对象空字符串可能不合适。根据具体业务逻辑选择默认值如None可能更优。总结一个设计精良、功能聚焦、具备工业级健壮性的小型数据提取工具。它完美地诠释了“单一职责原则”将“从JSON列表中提取指定字段”这一任务完成得高效而可靠。其代码体现了现代Python编程的诸多优秀实践包括上下文管理、防御性编程、安全的字典操作、结构化的异常处理以及清晰的数据转换逻辑。尽管在灵活性和扩展性上有其局限但作为解决特定问题的专用脚本它是一个非常出色的范本并且其核心思想和代码结构可以轻松地被借鉴和扩展以适应更复杂的数据处理需求。通过参数化、功能增强和性能优化它可以成长为一个功能强大的通用数据提取实用程序。源代码import json def extract_outputs(): try: # 读取results2.json文件 with open(./results.json, r, encodingutf-8) as file: data json.load(file) # 提取所有output字段内容 outputs_list [item.get(output, ) for item in data] # 创建新的数据结构 output_data { outputs: outputs_list } # 写入outputs.json文件 with open(./outputs.json, w, encodingutf-8) as file: json.dump(output_data, file, ensure_asciiFalse, indent2) print(f成功提取 {len(outputs_list)} 个output字段到outputs.json文件) except FileNotFoundError: print(错误找不到results2.json文件) except json.JSONDecodeError: print(错误results2.json文件格式不正确) except Exception as e: print(f发生错误{e}) if __name__ __main__: extract_outputs()

更多文章