在python中将txt文件转换为JSON

2024-05-21 05:39:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个txt文件,其格式如下所示,并且密钥字符串不在引号中。如何使用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"
}

Tags: 文件字符串nametxtjsonstreetaddressaddresses
2条回答

假设你的数据是

{
    '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

^{pr2}$

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

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

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

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

  1. 纯数据。该行由一个键值对组成,至少用一个空格隔开。在
  2. 新的子对象。该行以键开头,以大括号{结尾。在
  3. 当前子对象的结尾。该行包含一个右大括号}

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)

输出

^{pr2}$

相关问题 更多 >