Пустой объект json при чтении текстового файла - PullRequest
0 голосов
/ 27 мая 2019

Я тестирую скрипт на python с текстовыми данными. Возможность запустить скрипт и вернуть действительный файл json, если текст включен в скрипт, но я получил пустой объект json при запуске скрипта и с отдельным текстовым файлом.

Вывод только пустого файла json

{
  "ospf": []
}

Приведенный ниже код возвращает пустой объект json при запуске его с прочитанным текстовым файлом

import json

result = {}
l = []

with open('data.txt') as myf:
   for i in myf:
     if i:
        p = [parameter for parameter in i.split("*")]
        for line, x in enumerate(p[0].split("\n")):
            if x and "Ls id" in x:
                ls_id, ip = x.split(": ")
                ls_id = ls_id.strip()
                ip = ip.strip()
        for y in p[1:]:
            if y and "P-2-P" in y:
                temp = {ls_id:ip}
                for items in y.split("\n"):
                    try:
                        key, value = items.split(": ")
                        key = key.strip()
                        value = value.strip()
                        temp[key] = value
                    except ValueError:
                       pass
                l.append(temp)
result["ospf"] = l
print (json.dumps(result,indent=2))

with open('data.json', 'w') as json_file:
    json.dump(result, json_file)

При выполнении приведенного ниже кода все в порядке с текстовыми данными, включенными в качестве данных .. нет проблем

import json

data = '''
  Type      : Router
  Ls id     : 1.1.1.2
  Adv rtr   : 1.1.1.2
  Ls age    : 201
  Len       : 84
  Link count: 5
   * Link ID: 1.1.1.2
     Data   : 255.255.255.255
     Link Type: StubNet
     Metric : 1
     Priority : Medium
   * Link ID: 1.1.1.4
     Data   : 192.168.100.34
     Link Type: P-2-P
     Metric : 1
   * Link ID: 192.168.100.33
     Data   : 255.255.255.255
     Link Type: StubNet
     Metric : 1
     Priority : Medium
   * Link ID: 1.1.1.1
     Data   : 192.168.100.53
     Link Type: P-2-P
     Metric : 1
   * Link ID: 192.168.100.54
     Data   : 255.255.255.255
     Link Type: StubNet
     Metric : 1
     Priority : Medium

  Type      : Router
  Ls id     : 1.1.1.1
  Adv rtr   : 1.1.1.1
  Ls age    : 1699
  Len       : 96
  Options   :  ASBR  E
  seq#      : 80008d72
  chksum    : 0x16fc
  Link count: 6
   * Link ID: 1.1.1.1
     Data   : 255.255.255.255
     Link Type: StubNet
     Metric : 1
     Priority : Medium
   * Link ID: 1.1.1.1
     Data   : 255.255.255.255
     Link Type: StubNet
     Metric : 12
     Priority : Medium
   * Link ID: 1.1.1.3
     Data   : 192.168.100.26
     Link Type: P-2-P
     Metric : 10
   * Link ID: 192.168.100.25
     Data   : 255.255.255.255
     Link Type: StubNet
     Metric : 10
     Priority : Medium
   * Link ID: 1.1.1.2
     Data   : 192.168.100.54
     Link Type: P-2-P
     Metric : 10
   * Link ID: 192.168.100.53
     Data   : 255.255.255.255
     Link Type: StubNet
     Metric : 10
     Priority : Medium'''

import json

result = {}
l = []
for i in data.split("\n\n"):
    if i:
        p = [parameter for parameter in i.split("*")]
        for line, x in enumerate(p[0].split("\n")):
            if x and "Ls id" in x:
                ls_id, ip = x.split(": ")
                ls_id = ls_id.strip()
                ip = ip.strip()
        for y in p[1:]:
            if y and "P-2-P" in y:
                temp = {ls_id:ip}
                for items in y.split("\n"):
                    try:
                        key, value = items.split(": ")
                        key = key.strip()
                        value = value.strip()
                        temp[key] = value
                    except ValueError:
                       pass
                l.append(temp)
result["ospf"] = l
print (json.dumps(result,indent=2))

with open('data.json', 'w') as json_file:
    json.dump(result, json_file)

Я не уверен, где я делаю неправильно. Пожалуйста, посоветуйте мне дальше. Спасибо.

1 Ответ

0 голосов
/ 27 мая 2019

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

import json

result = {}
l = []

with open('data.txt') as myf:

    a = ''.join(myf)
    for i in a.split("\n\n"):
     if i:
        p = [parameter for parameter in i.split("*")]
        for line, x in enumerate(p[0].split("\n")):
            if x and "Ls id" in x:
                ls_id, ip = x.split(": ")
                ls_id = ls_id.strip()
                ip = ip.strip()
        for y in p[1:]:
            if y and "P-2-P" in y:
                temp = {ls_id:ip}
                for items in y.split("\n"):
                    try:
                        key, value = items.split(": ")
                        key = key.strip()
                        value = value.strip()
                        temp[key] = value
                    except ValueError:
                       pass
                l.append(temp)
result["ospf"] = l
print (json.dumps(result,indent=2))
with open('data.json', 'w') as json_file:
    json.dump(result, json_file)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...