在python中将txt文件转换为JSON

时间:2018-04-25 06:40:11

标签: python json text-files

我有一个txt文件,其格式如下所示,Key字符串不在引号中。如何使用python转换为JSON?

name {
  first_name: "random"
}
addresses {
  location {
    locality: "India"
    street_address: "xyz"
    postal_code: "300092"
    full_address: "street 1 , abc,India"
  }
}
projects {
  url: "www.githib.com"
}

2 个答案:

答案 0 :(得分:0)

假设您的数据为,

{
    'addresses': {
        'location': {
            'full_address': 'street 1 , abc,India',
            'locality': 'India',
            'postal_code': '300092',
            'street_address': 'xyz'
        }
    },
    'name': {
        'first_name': 'random'
    },
    'projects': {
        'url': 'www.githib.com'
    }
}

使用json.dumps将dict转换为json

In [16]: import json

In [17]: data
Out[17]:
{'addresses': {'location': {'full_address': 'street 1 , abc,India',
   'locality': 'India',
   'postal_code': '300092',
   'street_address': 'xyz'}},
 'name': {'first_name': 'random'},
 'projects': {'url': 'www.githib.com'}}

In [18]: json.dumps(data)
Out[18]: '{"name": {"first_name": "random"}, "projects": {"url": "www.githib.com"}, "addresses": {"location": {"postal_code": "300092", "full_address": "street 1 , abc,India", "street_address": "xyz", "locality": "India"}}}'

In [19]:

答案 1 :(得分:0)

标准库中没有简单的方法将该数据格式转换为JSON,因此我们需要编写一个解析器。但是,由于数据格式相当简单,因此并不难。我们可以使用标准csv模块来读取数据。 csv.reader将正确处理解析空格和引用字符串的细节。引用的字符串将被视为单个标记,可以引用由单个单词组成的标记,但它们不一定是。

csv.reader通常从打开的文件中获取数据,但它非常通用,并且还会从字符串列表中读取数据。这在测试时很方便,因为我们可以将输入数据嵌入到脚本中。

我们将数据解析为嵌套字典。跟踪嵌套的一种简单方法是使用堆栈,我们可以使用普通列表作为堆栈。

下面的代码假定输入行可以是以下三种形式之一:

  1. 普通数据。该行由键值对组成,由至少一个空格分隔。
  2. 一个新的子对象。该行以键开头,以开放式大括号{结束。
  3. 当前子对象的结束。该行包含一个紧密支撑}
  4. import csv
    import json
    
    raw = '''\
    name {
      first_name: "random"
    }
    addresses {
      location {
        locality: "India"
        street_address: "xyz"
        postal_code: "300092"
        full_address: "street 1 , abc,India"
      }
    }
    projects {
      url: "www.githib.com"
    }
    '''.splitlines()
    
    # A stack to hold the parsed objects
    stack = [{}]
    
    reader = csv.reader(raw, delimiter=' ', skipinitialspace=True)
    for row in reader:
        #print(row)
        key = row[0]
        if key == '}':
            # The end of the current object
            stack.pop()
            continue
        val = row[-1]
        if val == '{':
            # A new subobject
            stack[-1][key] = d = {}
            stack.append(d)
        else:
            # A line of plain data
            stack[-1][key] = val
    
    # Convert to JSON
    out = json.dumps(stack[0], indent=4)
    print(out)
    

    <强>输出

    {
        "name": {
            "first_name:": "random"
        },
        "addresses": {
            "location": {
                "locality:": "India",
                "street_address:": "xyz",
                "postal_code:": "300092",
                "full_address:": "street 1 , abc,India"
            }
        },
        "projects": {
            "url:": "www.githib.com"
        }
    }