求助:使用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
相关产品推荐
相关产品推荐

