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

求助:使用Pandas读取含JSON列的CSV文件时分隔异常问题

解决Pandas读取含JSON列的CSV时的分隔错误问题

问题原因

你的CSV里部分列是JSON格式,JSON内部的逗号被Pandas当成了列分隔符,导致列拆分错误。之前用的正则会删除字符,是因为正则匹配到了「字符+逗号」的组合,Pandas把整个组合作为分隔符,从而删掉了前面的字符。

正确解决方案

方案1:用断言正则作为分隔符

使用反向/正向否定断言的正则,只匹配不在JSON大括号内部的逗号,且不会消耗额外字符:

import pandas as pd
import json

# 定义匹配非JSON内部逗号的正则
sep_regex = r'(?<!{[^}]*),(?![^{]*})'

# 读取CSV,指定正则分隔符和Python引擎(C引擎不支持复杂正则)
df = pd.read_csv(
    's3://bucket-name/file.csv',
    sep=sep_regex,
    engine='python'
)

# 可选:将NONE替换为缺失值
df = df.replace('NONE', pd.NA)

# 定义JSON解析函数
def parse_json(s):
    if pd.isna(s):
        return None
    try:
        return json.loads(s)
    except json.JSONDecodeError:
        return s

# 解析JSON列(示例为第3、5列,可根据实际调整)
df.iloc[:, 2] = df.iloc[:, 2].apply(parse_json)
df.iloc[:, 4] = df.iloc[:, 4].apply(parse_json)

正则说明:

  • (?<!{[^}]*):反向否定断言,确保逗号前面不在{开头的未闭合JSON结构内
  • (?![^{]*}):正向否定断言,确保逗号后面不在未闭合的JSON结构内
    这样只会把真正的列分隔逗号匹配出来,不会破坏JSON内容。

方案2:逐行手动拆分(更可靠)

如果正则仍有边界问题,可以通过跟踪大括号层级来拆分每行:

import pandas as pd
import json

data = []
# 若读取S3文件,可先用s3fs或boto3下载到本地,或直接打开流
with open('local_file.csv', 'r') as f:
    for line in f:
        line = line.strip()
        if not line:
            continue
        
        brace_level = 0
        split_points = []
        # 遍历每行字符,记录非JSON内的逗号位置
        for idx, char in enumerate(line):
            if char == '{':
                brace_level += 1
            elif char == '}':
                brace_level -= 1
            elif char == ',' and brace_level == 0:
                split_points.append(idx)
        
        # 拆分行内容
        parts = []
        prev_idx = 0
        for idx in split_points:
            parts.append(line[prev_idx:idx].strip())
            prev_idx = idx + 1
        parts.append(line[prev_idx:].strip())
        data.append(parts)

# 转为DataFrame,可自定义列名
df = pd.DataFrame(data, columns=['col1', 'col2', 'col3', 'col4', 'col5'])

# 解析JSON列
df['col3'] = df['col3'].apply(parse_json)
df['col5'] = df['col5'].apply(parse_json)

这个方法通过实时跟踪大括号的嵌套层级,只在层级为0(不在JSON内部)时拆分,完全避免了JSON内逗号的干扰,适合复杂JSON场景。

内容的提问来源于stack exchange,提问作者Sanket Makani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 00:25:20