如何用Pandas读取每行含完整JSON结构的CSV文件
解决每行是完整JSON结构的"CSV"文件读取问题
你的文件本质并非标准CSV,而是每行一个独立JSON对象的文本文件,直接用pd.read_csv()会因JSON内部的逗号被误判为CSV分隔符,导致解析混乱。以下是两种可靠的解决方案:
方法一:使用pd.read_json()直接读取
利用read_json的lines=True参数,指定每行是单个JSON对象,再处理MongoDB风格的$date格式:
import pandas as pd from datetime import datetime # 递归解析MongoDB的$date格式(毫秒时间戳转datetime) def parse_mongo_date(obj): if isinstance(obj, dict) and '$date' in obj: return datetime.fromtimestamp(obj['$date'] / 1000) elif isinstance(obj, list): return [parse_mongo_date(item) for item in obj] elif isinstance(obj, dict): return {key: parse_mongo_date(value) for key, value in obj.items()} return obj # 读取文件,lines=True表示每行一个JSON df = pd.read_json('despachoCaminhao_14_08.csv', lines=True) # 对嵌套的日期字段进行转换 df['createdDate'] = df['createdDate'].apply(parse_mongo_date) df['dataInicioTrajeto'] = df['dataInicioTrajeto'].apply(parse_mongo_date) df['historicoStatusViagem'] = df['historicoStatusViagem'].apply(parse_mongo_date)
方法二:逐行读取解析(更灵活)
如果文件存在格式瑕疵(比如空行、非JSON行),逐行处理能更好地容错:
import pandas as pd import json from datetime import datetime def process_json_line(line): # 解析单行JSON data = json.loads(line.strip()) # 递归转换日期格式 def convert_date(obj): if isinstance(obj, dict) and '$date' in obj: return datetime.fromtimestamp(obj['$date'] / 1000) elif isinstance(obj, list): return [convert_date(item) for item in obj] elif isinstance(obj, dict): return {k: convert_date(v) for k, v in obj.items()} return obj return convert_date(data) # 逐行读取并收集数据 data_list = [] with open('despachoCaminhao_14_08.csv', 'r', encoding='utf-8') as f: for line in f: cleaned_line = line.strip() if cleaned_line: # 跳过空行 data_list.append(process_json_line(cleaned_line)) # 转换为DataFrame df = pd.DataFrame(data_list)
为什么之前的方法失败?
pd.read_csv()默认按逗号分割字段,但JSON内部的逗号是语法组成部分,不是字段分隔符,会导致JSON被拆成大量错误列。converters参数是针对CSV的列做处理,但此时CSV的列本身就解析错误,因此无法生效。
内容的提问来源于stack exchange,提问作者Leonardo Sandre
相关产品推荐
相关产品推荐

