Как проанализировать данные многострочных и многострочных строк и извлечь данные в файл JSON, используя Python - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь добавить данные ниже в файл JSON ... это всего лишь пример, так как я все еще учусь делать это.

ITEM    QTY   ID        DESCR   LOCATION                    
item1   3     it111     Gold    Rack11      
item2   10    it222     Silver  Rack22   
item3   6     it333     Red     Rack33      
item4   1     it444     Blue    Rack44 

, например, ниже, я могу добавить значение класса и владельца, потому что он выводит только одну строку и одну строку.Но вывод деталей ключа состоит из нескольких строк ключа и значения, и я не уверен, как читать его построчно и анализировать в json.

{
     "product": [
        {
         "class":"food",
         "owner":"user1",
        }
     ]
}

Ожидается окончательный вывод, как показано ниже

{
     "product": [
        {
         "class":"food",
         "owner":"user1",
         "details": [
         {
          "item":"item1",
          "qty":"3",
          "id":"it111",
          "desc":"Gold",
          "loct":"Rack11"
         },
         {
          "item":"item2",
          "qty":"10",
          "id":"it222",
          "desc":"Silver",
          "loct":"Rack22"
         },
         {
          "item":"item3",
          "qty":"6",
          "id":"it333",
          "desc":"Red",
          "loct":"Rack33"
         },
         {
          "item":"item4",
          "qty":"1",
          "id":"it444",
          "desc":"Blue",
          "loct":"Rack44"
         }
        ] 
       }
     ]
}

Мой список, как показано ниже

product = "class","owner","details"

Проблема в том, что я не знаю, как получить подробный вывод в «детали» и сформировать его во вложенную структуру json.Ценю вашу помощь.Спасибо


Использование CSV-ридера является решением, если вводимый текст разделен табуляцией.Это работает ... как указано ниже.Основываясь на информации ... Я пытаюсь применить то же самое с другим набором текста ввода, похожего, и это дает мне ошибку

ValueError: need more than 4 values to unpack

образец набора текста ввода, как показано ниже

Local Interface   Parent Interface   Chassis Id          Port info    System Name
xe-3/0/4.0        ae31.0             b0:c6:9a:63:80:40   xe-0/0/0.0   host.xsrt1.net
xe-3/0/5.0        ae31.0             b0:c6:9a:63:80:40   xe-0/0/1.0   host.xsrt1.net
xe-3/0/6.0        ae31.0             b0:c6:9a:63:80:40   xe-0/0/2.0   host.xsrt1.net
xe-3/0/7.0        ae31.0             b0:c6:9a:63:80:40   xe-0/0/3.0   host.xsrt1.net
xe-3/0/0.0        ae31.0             b0:c6:9a:63:80:40   xe-0/1/0.0   host.xsrt1.net
xe-3/0/1.0        ae31.0             b0:c6:9a:63:80:40   xe-0/1/1.0   host.xsrt1.net
xe-3/0/2.0        ae31.0             b0:c6:9a:63:80:40   xe-0/1/2.0   host.xsrt1.net
xe-3/0/3.0        ae31.0             b0:c6:9a:63:80:40   xe-0/1/3.0   host.xsrt1.net

Я не уверен, почему ... но, возможно, это не совсем формат табуляции с разделителями ... если это так, как преобразовать его в правильный формат с разделителями табуляции?Спасибо

Update1 : для указанного выше ввода я разбил на строки с тестовым кодом ниже

with open('lldp.csv', 'r', newline='') as csv_file:
   reader = csv.reader(line.replace('  ', ',') for line in csv_file)
   my_list = list(reader)
   pprint(my_list)  

Вывод, как показано ниже

[['Local Interface',' Parent Interface',' Chassis Id','','','','','Port 
info','','System Name'],['xe-3/0/4.0','','','','ae31.0','','','','','',' 
b0:c6:9a:63:80:40',' xe-0/0/0.0',' host.jnpr.net'],['xe- 
3/0/5.0','','','','ae31.0','','','','','',' b0:c6:9a:63:80:40',' xe- 
0/0/1.0',' host.jnpr.net'],['xe-3/0/6.0','','','','ae31.0','','','','','',' 
b0:c6:9a:63:80:40',' xe-0/0/2.0',' host.jnpr.net'],['xe- 
3/0/7.0','','','','ae31.0','','','','','',' b0:c6:9a:63:80:40',' xe- 
0/0/3.0',' host.jnpr.net'],['xe-3/0/0.0','','','','ae31.0','','','','','',' 
b0:c6:9a:63:80:40',' xe-0/1/0.0',' host.jnpr.net'],['xe- 
3/0/1.0','','','','ae31.0','','','','','',' b0:c6:9a:63:80:40',' xe- 
0/1/1.0',' host.jnpr.net'],['xe-3/0/2.0','','','','ae31.0','','','','','',' 
b0:c6:9a:63:80:40',' xe-0/1/2.0',' host.jnpr.net'],['xe- 
3/0/3.0','','','','ae31.0','','','','','',' b0:c6:9a:63:80:40',' xe- 
0/1/3.0',' host.jnpr.net']]  

Сверху как удалить ненужные '' и как начать читать строку со 2-й строки (1-я строка - только заголовок).Из списка я хочу разобрать его на json, как указано выше.

Я открою новый вопрос для моего вопроса выше и сосредоточусь на выводе выше Спасибо

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Я не уверен, как вы перебираете начальный список класса и владельца, но его сгенерирует желаемый результат:

import pandas as pd
import json


data = [
['item1','3','it111','Gold','Rack11'],
['item2','10','it222','Silver','Rack22'],  
['item3','6','it333','Red','Rack33'],      
['item4','1','it444','Blue','Rack44']]

df = pd.DataFrame(data,columns=['ITEM','QTY','ID','DESCR','LOCATION'])

#Above was so I had the data to work with, but you can read it in with pandas if its an excel or csv file

# df = pd.read_csv('path/to/datafile.csv')

jsonDict = {}
jsonDict["product"] = []
jsonDict["product"].append({})

jsonDict["product"][0]["class"] = "food"
jsonDict["product"][0]["owner"] = "user1"
jsonDict["product"][0]["details"] = []

for i, row in df.iterrows():

    temp_dict = {}
    temp_dict['item'] = row['ITEM'] 
    temp_dict['qty'] = row['QTY'] 
    temp_dict['id_num'] = row['ID'] 
    temp_dict['desc'] = row['DESCR'] 
    temp_dict['loct'] = row['LOCATION'] 

    jsonDict["product"][0]["details"].append(temp_dict)

with open('data.json', 'w') as fp:
    json.dump(jsonDict, fp, indent=3, sort_keys=False) 
0 голосов
/ 22 февраля 2019

Я предлагаю вам использовать csv reader , если столбцы разделены табуляцией.

Сначала вы создаете базовый словарь со значениями "class" и "owner" и пустой список для"details".Затем вы анализируете строки одну за другой и добавляете отдельные детали.

import csv
import json

out = {
    "product": [
        {
            "class": "food",
            "owner": "user1",
            "details": []
        }
    ]
}

with open("data.csv") as f:
    reader = csv.reader(f, delimiter="\t")
    next(reader) # skip header

    for row in reader:

        detail = {
            "item": row[0],
            "qty" : row[1],
            "id"  : row[2],
            "desc": row[3],
            "loct": row[4]
        }

        out["product"][0]["details"].append(detail)

# now out contains the final dictionary, you can output it like this:
print(json.dumps(out, indent=4))

Мне не ясно, почему вы бы включили "product" в список, если у вас есть только один элемент - я думаю,Затем вы пополните список другими продуктами.

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