Конвертировать TXT-файл в JSON в Python - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть текстовый файл, который имеет формат, показанный ниже, и строки ключей не в кавычках.Как я могу преобразовать в JSON с помощью Python?

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 голосов
/ 25 апреля 2018

В стандартной библиотеке нет простого способа преобразовать этот формат данных в 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)

выход

{
    "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"
    }
}
0 голосов
/ 25 апреля 2018

Принимая ваши данные как,

{
    '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]:
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...