我需要读取一些JSON数据进行处理。我有一个包含多个JSON对象的线文件,该如何解析呢?
我希望输出为每个对象一行的文件。
我尝试了一种蛮力方法,该方法将递归使用json.loads来检查json是否有效,但是每次运行程序时都会得到不同的结果
import json
with open('sample.json') as inp:
s = inp.read()
jsons = []
start, end = s.find('{'), s.find('}')
while True:
try:
jsons.append(json.loads(s[start:end + 1]))
print(jsons)
except ValueError:
end = end + 1 + s[end + 1:].find('}')
else:
s = s[end + 1:]
if not s:
break
start, end = s.find('{'), s.find('}')
for x in jsons:
writeToFilee(x)
可以在这里看到json格式 https://pastebin.com/DgbyjAG9
答案 0 :(得分:1)
为什么不仅仅使用JSONDecodeError
的pos
属性来告诉您在何处划界呢?
类似:
import json
def json_load_all(buf):
while True:
try:
yield json.loads(buf)
except json.JSONDecodeError as err:
yield json.loads(buf[:err.pos])
buf = buf[err.pos:]
else:
break
以如下方式使用您的演示数据:
with open('data.json') as fd:
arr = list(json_load_all(fd.read()))
正好给了我两个要素,但我想您还有更多?
要使用标准库完成此操作,写出内容类似于:
with open('data.json') as inp, open('out.json', 'w') as out:
for obj in json_load_all(inp.read()):
json.dump(obj, out)
print(file=out)
否则,jsonlines
软件包非常适合处理这种数据格式
答案 1 :(得分:1)
以下代码对我有用:
import json
with open(input_file_path) as f_in:
file_data = f_in.read()
file_data = file_data.replace("}{", "},{")
file_data = "[" + file_data + "]"
data = json.loads(file_data)
答案 2 :(得分:0)
在@Chris A的评论之后,我准备了此片段,该片段应该可以正常工作:
with open('my_jsons.file') as file:
json_string = file.read()
json_objects = re.sub('}\s*{', '}|!|{', json_string).split('|!|')
# replace |!| with whatever suits you best
for json_object in json_objects:
print(json.loads(obj))
但是,一旦} {“字符串出现在JSON中的某个值中,此示例将一文不值,因此我强烈建议使用@Sam Mason的解决方案