如何合并含DataFrame的独立JSON文件并按disliked_vote规则重合并?
实现按disliked_vote拆分合并JSON格式DataFrame文件
核心思路
按文件名顺序遍历目标目录下的JSON文件,累积所有仅包含liked_vote=True的文件;当遇到包含disliked_vote=True的文件时,将累积的所有liked文件与当前disliked文件合并,统一把合并后所有行的liked_vote设为True、disliked_vote设为False,删除原文件后将结果保存为1.json;遍历结束后若还有未合并的liked文件,同样合并保存为1.json。
代码实现
import os import pandas as pd def merge_json_files(dir_path): # 获取目录下所有JSON文件,按文件名数字排序(保证1.json、2.json...的处理顺序) json_files = sorted( [f for f in os.listdir(dir_path) if f.endswith('.json')], key=lambda x: int(x.split('.')[0]) ) liked_file_paths = [] # 存储待合并的liked文件路径 for file_name in json_files: file_path = os.path.join(dir_path, file_name) df = pd.read_json(file_path) # 检查当前文件是否存在disliked_vote=True的行 has_disliked_entries = df['disliked_vote'].any() if not has_disliked_entries: # 无disliked内容,加入待合并列表 liked_file_paths.append(file_path) continue # 遇到含disliked的文件,执行合并操作 # 读取所有待合并的liked文件 liked_dfs = [pd.read_json(fp) for fp in liked_file_paths] # 合并liked文件与当前disliked文件 merged_df = pd.concat(liked_dfs + [df], ignore_index=True) # 统一设置投票标记 merged_df['liked_vote'] = True merged_df['disliked_vote'] = False # 删除所有参与合并的原文件 for fp in liked_file_paths + [file_path]: os.remove(fp) # 保存合并结果为1.json output_path = os.path.join(dir_path, '1.json') if os.path.exists(output_path): os.remove(output_path) merged_df.to_json(output_path, orient='records') # 清空待合并列表,继续处理后续文件 liked_file_paths = [] # 处理遍历结束后剩余的liked文件 if liked_file_paths: liked_dfs = [pd.read_json(fp) for fp in liked_file_paths] merged_df = pd.concat(liked_dfs, ignore_index=True) output_path = os.path.join(dir_path, '1.json') if os.path.exists(output_path): os.remove(output_path) merged_df.to_json(output_path, orient='records') # 删除剩余的原文件 for fp in liked_file_paths: os.remove(fp) # 调用示例:替换为你的目标目录路径 merge_json_files('./dir')
关键说明
- 文件排序:通过提取文件名中的数字进行排序,确保处理顺序与文件命名顺序一致
- 内存优化:仅存储文件路径,合并时才读取DataFrame,避免大文件占用过多内存
- 数据安全:建议在运行代码前备份原始文件,防止误删或数据丢失
- 格式适配:如果你的JSON文件不是
records格式(比如是split或index),需要调整pd.read_json和pd.to_json的orient参数
内容的提问来源于stack exchange,提问作者skidjoe
相关产品推荐
相关产品推荐

