如何编写Python生成器将混合JSON与TSV格式数据转换为指定结构字典
混合JSON/TSV行格式文件解析实现
原有代码问题
你现有的代码直接使用pd.read_csv按制表符分隔读取整个文件是行不通的:JSON格式的行没有制表符,会被整体识别为第一列数据,TSV格式的行会被切分为多列,两类数据无法统一处理,后续逐列加载解析的逻辑自然也不生效。
实现思路
针对每行混合两种格式的特点,按以下逻辑处理:
- 逐行读取数据,先尝试用JSON解析,如果解析成功直接返回合规字典
- JSON解析失败的行判定为TSV格式,按制表符切割后映射到指定字段,注意将
client_count字段转为整数类型 - 整个逻辑封装为接收行迭代器的生成器,满足需求
完整实现代码
import json import pandas as pd def parse_mixed_lines(line_iterator): # 定义固定的字段顺序,对应TSV行的字段顺序 FIELD_ORDER = ["company", "catch_phrase", "phone", "timezone", "client_count"] for line in line_iterator: # 去除首尾空白、换行符 stripped_line = line.strip() if not stripped_line: continue # 先尝试解析为JSON try: row_dict = json.loads(stripped_line) yield row_dict except json.JSONDecodeError: # 解析失败则按TSV处理 tsv_fields = [field.strip() for field in stripped_line.split('\t')] # 映射为字典,client_count转整数 row_dict = dict(zip(FIELD_ORDER, tsv_fields)) row_dict["client_count"] = int(row_dict["client_count"]) yield row_dict # 使用示例 if __name__ == "__main__": # 打开文件,文件对象本身就是行迭代器 with open("file.data", "r", encoding="utf-8") as f: # 生成器直接传入pandas构建DataFrame df = pd.DataFrame(parse_mixed_lines(f)) # 后续可以正常操作df print(df)
代码说明
- 生成器的参数
line_iterator可以接收任意行迭代对象,除了文件对象外,也可以传入提前读取好的行列表迭代器,适配性更强 - 严格按照要求返回包含指定5个键的字典,JSON行保证结构合规直接返回,TSV行手动映射保证字段一致
- 空行会自动跳过,避免异常
内容的提问来源于stack exchange,提问作者Hefe
相关产品推荐
相关产品推荐

