python - 在python3.6中将两个jsonl(json行)文件合并并写入一个新的jsonl文件
问题描述
您好,我有两个jsonl
这样的文件:
one.jsonl
{"name": "one", "description": "testDescription...", "comment": "1"}
{"name": "two", "description": "testDescription2...", "comment": "2"}
second.jsonl
{"name": "eleven", "description": "testDescription11...", "comment": "11"}
{"name": "twelve", "description": "testDescription12...", "comment": "12"}
{"name": "thirteen", "description": "testDescription13...", "comment": "13"}
我的目标是编写一个新jsonl
文件(保留编码)名称merged_file.jsonl
,如下所示:
{"name": "one", "description": "testDescription...", "comment": "1"}
{"name": "two", "description": "testDescription2...", "comment": "2"}
{"name": "eleven", "description": "testDescription11...", "comment": "11"}
{"name": "twelve", "description": "testDescription12...", "comment": "12"}
{"name": "thirteen", "description": "testDescription13...", "comment": "13"}
我的方法是这样的:
import json
import glob
result = []
for f in glob.glob("folder_with_all_jsonl/*.jsonl"):
with open(f, 'r', encoding='utf-8-sig') as infile:
try:
result.append(extract_json(infile)) #tried json.loads(infile) too
except ValueError:
print(f)
#write the file in BOM TO preserve the emojis and special characters
with open('merged_file.jsonl','w', encoding= 'utf-8-sig') as outfile:
json.dump(result, outfile)
但是我遇到了这个错误:
TypeError: Object of type generator is not JSON serializable
我会以任何方式感谢您的提示/帮助。谢谢!我查看了其他 SO 存储库,它们都在编写普通的 json 文件,这在我的情况下也应该可以工作,但它一直失败。
像这样读取单个文件有效:
data_json = io.open('one.jsonl', mode='r', encoding='utf-8-sig') # Opens in the JSONL file
data_python = extract_json(data_json)
for line in data_python:
print(line)
####outputs####
#{'name': 'one', 'description': 'testDescription...', 'comment': '1'}
#{'name': 'two', 'description': 'testDescription2...', 'comment': '2'}
解决方案
extract_json 有可能返回一个生成器而不是一个列表/字典,它是 json 可序列化
的,因为它是 jsonl,这意味着每一行都是一个有效的 json
,所以你只需要稍微调整你现有的代码。
import json
import glob
result = []
for f in glob.glob("folder_with_all_jsonl/*.jsonl"):
with open(f, 'r', encoding='utf-8-sig') as infile:
for line in infile.readlines():
try:
result.append(json.loads(line)) # read each line of the file
except ValueError:
print(f)
# This would output jsonl
with open('merged_file.jsonl','w', encoding= 'utf-8-sig') as outfile:
#json.dump(result, outfile)
#write each line as a json
outfile.write("\n".join(map(json.dumps, result)))
现在我想起来了,你甚至不必使用 json 来加载它,除了它会帮助你清理任何格式错误的 JSON 行。
你可以像这样在一个镜头中收集所有的线条
outfile = open('merged_file.jsonl','w', encoding= 'utf-8-sig')
for f in glob.glob("folder_with_all_jsonl/*.jsonl"):
with open(f, 'r', encoding='utf-8-sig') as infile:
for line in infile.readlines():
outfile.write(line)
outfile.close()
推荐阅读
- javascript - 在 Cypress 中重试命令失败后的选项
- c++ - 在 C++ 中删除字符串中非字母的所有字符
- stanford-nlp - 斯坦福 CoreNLP 能否在给定自定义 POS 的情况下对单词进行词形还原?
- angular - 模板更新不会在测试中发生
- java - 如何使用 java 从 gcp 存储桶下载文件夹?
- php - 如何在主目录而不是ubuntu的子目录中安装wordpress?
- angular - Auth0 与 NGRX 的集成
- django - 从 Django 中的其他 save() 方法继承时表单 save() 方法中的冲突
- reactjs - 在 reactjs 应用程序中使用 youtube 数据 api 时出现 Gapi 错误
- scala - Kafka 消费者不会间歇性地轮询记录