You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 17:35:14