Python合并同目录多JSON文件为空及读取RDS文件报错如何解决
问题1:JSON文件合并为空/解析报错
原代码的核心问题是没有拼接完整文件路径,os.walk遍历到子目录时直接传入文件名会找不到文件,另外R导出的JSON格式可能和pandas默认读取规则不匹配,同时循环concat性能极低。修正方案如下:
import pandas as pd import os from tqdm import tqdm import json df_list = [] error_files = [] for subdir, dirs, files in os.walk('.'): for file in tqdm(files): if file.endswith(".json"): full_path = os.path.join(subdir, file) try: # 先尝试默认读取 try: temp_df = pd.read_json(full_path) except ValueError: # 适配R导出的常见JSON结构 with open(full_path, 'r', encoding='utf-8') as f: json_data = json.load(f) temp_df = pd.DataFrame(json_data) df_list.append(temp_df) except Exception as e: error_files.append((file, str(e))) continue # 一次性合并所有数据 df = pd.concat(df_list, axis=0, ignore_index=True) print(f"合并完成,共{len(df)}行数据") if error_files: print(f"解析失败文件共{len(error_files)}个:") for f, err in error_files[:10]: print(f"{f}: {err}")
如果仍有解析失败的文件,取单个报错文件直接打印json_data的结构,对应调整转DataFrame的逻辑即可。
问题2:读取RDS文件报错
原代码的问题有两个:一是R的readRDS函数没有编码参数,额外传入的"utf-8"属于无效参数;二是旧版pandas2ri的转换逻辑兼容性差,行名为空时会触发NULLType报错。
优先推荐方案(无需rpy2)
用pyreadr库直接读取RDS,兼容性更高:
- 安装依赖:
pip install pyreadr
- 读取代码:
import pyreadr rds_data = pyreadr.read_r('users.rds') df = rds_data[None]
rpy2兼容方案
如果必须用rpy2,使用新版转换逻辑规避错误:
import rpy2.robjects as robjects from rpy2.robjects import pandas2ri from rpy2.robjects.conversion import localconverter readRDS = robjects.r['readRDS'] # 不要传多余的编码参数 r_df = readRDS('users.rds') # 手动设置行名避免空值报错 r_df.rownames = robjects.IntVector(range(1, robjects.r['nrow'](r_df)[0]+1)) with localconverter(robjects.default_converter + pandas2ri.converter): df = robjects.conversion.rpy2py(r_df)
内容的提问来源于stack exchange,提问作者crackers
相关产品推荐
相关产品推荐

