从文本文件创建Json块

时间:2016-04-05 08:29:56

标签: python json

我有一个如下文本文件

    A : abc
    B : crs
    C : rds
    D : fgh

    A: wer
    B : tyu
    C : uio
    D : dfg

输入文本文件中可以有任意数量的上述块。我想从中创建一个json文件。这是我的代码:

import json
with open("<input file path>") as fd: # open file
    d = dict(line.split(":", 1) for line in fd) # create dict of it
print json.dumps(d) # print dict in json format

但是这不是在做这个工作,它省略了一些初始线而不是一个在另一个之下打印单独的块

2 个答案:

答案 0 :(得分:0)

您的文件具有非唯一键。请注意Python's json module only supports JSON object decoding with duplicate keys。您不能使用标准编码器使用重复键对JSON对象进行编码。

此外,您使用Python的dict类作为中间数据存储。因此,您丢失了数据条目订单,因为dict不维护商品订单。 OrderedDict类确实维护了项目顺序,但仍然不允许重复键,所以它也不是一个选项。

因此,除非您能在PyPI上找到支持对象的重复键编码的JSON包,否则您可能必须编写自己的JSON编码器。

所以最终的解决方案应如下所示:

  1. 自定义类,用于存储支持重复键和维护项目顺序的文件内容。基本上是键值对列表上的类包装器(您需要使用类包装器来阻止JSONEncoder将数据视为列表)。
  2. 继承自JSONEncoder的编码器类,它覆盖default方法,并为自定义数据类的实例定义自己的自定义转换。有关如何完成的详细信息,请参阅Python Docs
  3. To extend this to recognize other objects, subclass and implement a default() method with another method that returns a serializable object for o if possible, otherwise it should call the superclass implementation (to raise TypeError).

答案 1 :(得分:0)

我修改了你的代码:

[
  {
    "A": "abc", 
    "C": "rds", 
    "B": "crs", 
    "D": "fgh"
  }, 
  {
    "A": "wer", 
    "C": "uio", 
    "B": "tyu", 
    "D": "dfg"
  }
]

如果我理解正确,您可以使用以下输出:

{{1}}