Преобразование текста в объект JSON с помощью Python - PullRequest
0 голосов
/ 16 марта 2019

Я новичок в Python и хочу преобразовать текстовый файл со следующими примерами данных в формат json, Вот пример данных:

Пользователь

Имя: Джон

Офис: 1-й пр.

Дата рождения: 1978-01-01

Пользователь

Имя: Джейн

Офис: 2-й пр.

Дата рождения: 1970-01-01

Я хочу создать объект JSON, который выглядит следующим образом:

[{"Имя": "Джон", "Офис": "1-я авеню", "Дата рождения": "1978-01-01"}, {"Имя": "Джейн", "Офис": " 2nd Ave "," Дата рождения ":" 1970-01-01 "}]

Это просто пример данных, я хочу сделать это для очень больших данных, как я могу это сделать.

EDIT:

пробовал это:

details= ["Name","Office","Birth date"]

details_data = ["John", "1st Ave", "1978-01-01"]

data = dict(zip(details, details_data)

json.dump(data, file)

Приведенный выше код работает нормально, но как я могу преобразовать полные данные в формат json?

РЕДАКТИРОВАТЬ 2:

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что с ограниченным набором данных, т.е. примерно 1000-2000 строк, он работает, но когда я пытаюсь преобразовать очень большой файл, скажем, примерно 20000-30000, тогда он преобразует только те же самые первые 1000 -2000 строк.

Есть идеи о том, почему это происходит и как это можно решить?

1 Ответ

0 голосов
/ 16 марта 2019

Поскольку файл не в стандартном формате, о котором я знаю, вам придется перебирать его и составлять строки самостоятельно.

#!/usr/bin/env python3
import json

data = []
row_data = None
with open("example.txt") as example:
        for row in example:
                row = row.strip()
                if not row: # ignore newlines
                        continue

                if row == "User": # We have a new row and the last one is finished
                        if row_data:
                                data.append(row_data)
                        row_data = {}
                        continue

                key, value = row.split(": ")
                row_data[key] = value

data.append(row_data) # The last row is determined by the EOF not "User"

with open("example.json", "w") as jsonfile:
        json.dump(data, jsonfile)

with open("example.json") as jsonfile:
        print(json.load(jsonfile))

Результат:

[{'Name': 'John', 'Office': '1st Ave', 'Birth date': '1978-01-01'}, {'Name': 'Jane', 'Office': '2nd Ave', 'Birth date': '1970-01-01'}]

Объяснение того, что происходит:

Создайте новый список data, в котором будут размещены наши строки. Установите row_data на None, который будет использоваться в наших проверках позже ..

Мы убираем каждый ряд (это может быть необязательно, но кажется, что это не повредит).

Если строка "", мы пропустим ее, чтобы игнорировать все эти избыточные символы новой строки.

Если строка «Пользователь», это означает, что мы должны построить новую строку. Это также означает, что мы должны добавить последний ряд, если он у нас есть. Это будет происходить дважды с примером текста, который вы дали. Мы инициализируем пустой dict.

Для каждой второй строки, которую мы просто разделяем на «:», чтобы получить наш ключ и значение, мы добавляем этот ключ и значение к нашему row_data, пока не встретим другую строку «Пользователь».

Мы делаем это еще раз после того, как перебрали файл, чтобы получить последний ряд. Поскольку у нас не будет проверки «Пользователь», чтобы полагаться на добавление этой строки.

Мы открываем json и сбрасываем, как вы уже делали. Я открываю его, чтобы распечатать его для примера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...