4. 数据的整合与合并
Json文件的合并
经过以上处理,我们得到了许多json文件,位于同一目录/res之下,如图
而我们下一步就是需要将这些json文件进行合并,注意操作时仅需要合并json文件,其他txt文件不需要合并,因为所有txt经过上一步都转换为了json,以下是转换的具体操作。
转换函数的详细解释:
def merge_json_files(directory, output_filepath):
定义了一个名为merge_json_files
的函数,它接受两个参数:directory
(包含JSON文件的目录路径)和output_filepath
(合并后的输出文件路径)。
merged_data = []
初始化一个空列表merged_data
,用于存储所有合并的JSON对象。
# 获取目录中的所有json文件
for filename in os.listdir(directory):
使用os.listdir(directory)
列出指定目录中的所有文件和子目录,并开始遍历这些文件名。
if filename.endswith('.json'):
filepath = os.path.join(directory, filename)
with open(filepath, 'r', encoding='utf-8') as file:
# 读取并清理文件内容
file_content = file.read().replace('\n', '')
检查当前文件名是否以.json
结尾,如果是,构建文件的完整路径并以只读模式打开文件。读取文件内容并移除所有换行符(\n
),将其存储在file_content
变量中。
# 将文件内容转换为json对象并添加到列表
json_objects = file_content.split('}{')
for i in range(len(json_objects)):
if not json_objects[i].startswith('{'):
json_objects[i] = '{' + json_objects[i]
if not json_objects[i].endswith('}'):
json_objects[i] = json_objects[i] + '}'
将文件内容按'}{'
分割成多个JSON对象字符串,然后修正分割后每个对象的格式,确保每个对象以'{'
开始并以'}'
结束。
for obj in json_objects:
try:
json_obj = json.loads(obj)
merged_data.append(json_obj)
except json.JSONDecodeError as e:
print(f"Error decoding JSON from file {filename}: {e}")
遍历每个修正后的JSON字符串,将其解析为JSON对象并添加到merged_data
列表中。如果解析过程中遇到错误(如JSON格式错误),则捕获json.JSONDecodeError
异常,并打印错误信息。
# 将合并的数据写入指定的输出文件
with open(output_filepath, 'w', encoding='utf-8') as output_file:
json.dump(merged_data, output_file, ensure_ascii=False, indent=4)
使用with open
语句打开指定的输出文件路径,并以写入模式和UTF-8编码进行操作。然后使用json.dump
将合并的JSON数据写入文件,确保非ASCII字符不被转义,并使用4个空格进行缩进格式化。
print(f"Merged {len(merged_data)} JSON objects into {output_filepath}")
打印合并操作完成后的信息,显示合并的JSON对象数量和输出文件路径。
# 使用脚本
directory_path = 'E:\OneDrive\桌面\spider\\res' # 替换为你的json文件所在目录
output_path = 'E:\OneDrive\桌面\spider\merged.json' # 替换为你想要的输出文件路径
merge_json_files(directory_path, output_path)
设置脚本的使用路径,指定JSON文件所在的目录路径directory_path
和输出文件路径output_path
,然后调用merge_json_files
函数进行合并操作。
结果
合并后的json文件如下图所示
可以看到无论是数量还是质量都符合了要求,而接下来交由李尊宁同学做更专业的数据清洗工作后,就可以进行模型训练了。