Python 从 JSON 到 JSONL 的转换

新手上路,请多包涵

我希望将一个标准的 JSON 对象操作为一个对象,其中每一行都必须包含一个单独的、自包含的有效 JSON 对象。查看 JSON 行

JSON_file =

[{u'index': 1,
  u'no': 'A',
  u'met': u'1043205'},
 {u'index': 2,
  u'no': 'B',
  u'met': u'000031043206'},
 {u'index': 3,
  u'no': 'C',
  u'met': u'0031043207'}]

To JSONL

 {u'index': 1, u'no': 'A', u'met': u'1043205'}
{u'index': 2, u'no': 'B', u'met': u'031043206'}
{u'index': 3, u'no': 'C', u'met': u'0031043207'}

我当前的解决方案是将 JSON 文件作为文本文件读取,并从开头删除 [ ] 从结尾删除 —。因此,在每一行上创建一个有效的 JSON 对象,而不是包含行的嵌套对象。

请问有没有更优雅的解决方案?我怀疑在文件上使用字符串操作可能会出错。

动机是将 json 文件读入 Spark 上的 RDD。请参阅相关问题 - 使用 Apache Spark 读取 JSON - `corrupt_record`

原文由 LearningSlowly 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.5k
2 个回答

您的输入似乎是一系列 Python 对象;它肯定不是有效的 JSON 文档。

如果你有一个 Python 字典列表,那么你所要做的就是将每个条目分别转储到一个文件中,然后是一个换行符:

 import json

with open('output.jsonl', 'w') as outfile:
    for entry in JSON_file:
        json.dump(entry, outfile)
        outfile.write('\n')

json 模块的默认配置是输出不嵌入换行符的 JSON。

假设你的 ABC 名称是真正的字符串,将产生:

 {"index": 1, "met": "1043205", "no": "A"}
{"index": 2, "met": "000031043206", "no": "B"}
{"index": 3, "met": "0031043207", "no": "C"}

如果您从包含条目列表的 JSON 文档开始,只需首先使用 json.load() / json.loads() 解析该文档。

原文由 Martijn Pieters 发布,翻译遵循 CC BY-SA 3.0 许可协议

jsonlines 包是专门为您的用例制作的:

 import jsonlines

items = [
    {'a': 1, 'b': 2},
    {'a', 123, 'b': 456},
]
with jsonlines.open('output.jsonl', 'w') as writer:
    writer.write_all(items)

(是的,我是在您发布原始问题多年后写的。)

原文由 wouter bolsterlee 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题