Чтение с помощью tn.read в Python

Как я мог прочитать с помощью tn.read в Python, из приведенного ниже вывода только «Ont SN» только то, что написано в скобках, поэтому 485754437D85CA9E , «F/S/P» и «Ont EquipmentID»?

   Number              : 1
   F/S/P               : 0/17/7
   Ont SN              : 485754437D85CA9E (HWTC-7D85CA9E)
   Password            : 0x00000000000000000000
   Loid                : 
   Checkcode           : 
   VendorID            : HWTC
   Ont Version         : 159D.A
   Ont SoftwareVersion : V5R019C00S100
   Ont EquipmentID     : EG8145V5
   Ont autofind time   : 2020-12-15 09:35:48+01:00

   Number              : 2
   F/S/P               : 0/17/7
   Ont SN              : 48575443A9517A9E (HWTC-A9517A9E)
   Password            : 0x00000000000000000000
   Loid                : 
   Checkcode           : 
   VendorID            : HWTC
   Ont Version         : 159D.A
   Ont SoftwareVersion : V5R019C00S100
   Ont EquipmentID     : EG8145V5
   Ont autofind time   : 2020-12-15 08:47:37+01:00
   The number of GPON autofind ONT is 2

Подводя итог, мне понадобятся следующие данные:

0/17/7
48575443A9517A9E
EG8145V5

0/17/7
485754437D85CA9E
EG8145V5

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

def autofind(ip, user, password):
print('Connecting to OLT {0}'.format(ip))
try:
    tn = telnetlib.Telnet(ip, 23, 10)
except Exception as e:
    print("Error connecting to OLT, please check the IP address")
    sys.exit()

tn.read_until(b"name:")
tn.write(user.encode('utf-8') + b"\n")
time.sleep(.3)
tn.read_until(b"password:")
tn.write(password.encode('utf-8') + b"\n")
time.sleep(.3)

tn.write(b"enable\n")
time.sleep(.3)

# autofind
tn.write("display ont autofind all ".encode('utf-8') + b"\n")
return_lineid = tn.read_until('The number of GPON'.encode('utf-8'), 3).decode('utf-8')
data_return = return_lineid.splitlines()
records = []
current_record = {}
serials = []
f_s_p = []
passwords = []
autofind_list = []
autofind_object = {}
for line in data_return:
    line = line.strip()

    autofind_list.append(autofind_object)

    if not line:  # empty line
        records.append(current_record)
        current_record = {}
    else:

        if "F/S/P" in line:
            key, value = line.split(':')
            key = key.strip()
            value = value.strip()
            current_record[key] = value
            f_s_p.append(current_record[key])
            autofind_object['F/S/P'] = value
        if "Ont SN" in line:
            key, value = line.split(':')
            key = key.strip()
            value = value.strip()
            current_record[key] = value
            # regex for removing brackets for example (HWTC-7D85CA9E)
            serial = re.sub(r'\(.*\)', '', value)
            serials.append(serial)
            autofind_object['SN'] = serial
        if "Password" in line:
            key, value = line.split(':')
            key = key.strip()
            value = value.strip()
            if value == '0x00000000000000000000':
                passwords.append(None)
                autofind_object['Password'] = None
                autofind_list.append(autofind_object)
            else:
                passwords.append(current_record[key])
                autofind_object['Password'] = current_record[key]

print("These are the serials number in autofind: ")
print(serials)
print("These are the F/S/P:")
print(f_s_p)
print("These are the passwords:")
print(passwords)
print (autofind_list)

выход:

Connecting to OLT 10.240.0.19
These are the serials number in autofind: 
['485754437D85CA9E ', '48575443A9517A9E ']
These are the F/S/P:
['0/17/7', '0/17/7']
These are the passwords:
[None, None]
[{'F/S/P': '0/17/7', 'SN': '48575443A9517A9E ', 'Password': None}, {'F/S/P': '0/17/7', 'SN': '48575443A9517A9E ', 'Password': None}]
---
End of the script! 
Time elapsed: 4.27075457572937 seconds

Заранее спасибо за помощь

Не ответ, а подсказка - вы можете начать с преобразования строк из telnet в словари, возможно, их список - 1 элемент списка на запись, каждый из которых является словарем. Вы можете читать строки и разделять двоеточие, используя полосу для удаления лишнего пробела.

Danny Staple 15.12.2020 10:38
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
242
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот фрагмент, который должен превратить эти строки в список словарей:

records = []
current_record = {}
for line in data_return:
  line = line.strip()
  if not line: #empty line
    records.append(current_record)
    current_record = {}
  else:
    key, value = line.split(':')
    key = key.strip()
    value = value.strip()
    current_record[key] = value

Не полный ответ, но, надеюсь, полезный совет. Затем вы можете обработать серийный номер, понимание списка было бы хорошим способом сделать это.

Файл "autofind_OLT.py", строка 50, в ключе автопоиска значение = line.split(':') ValueError: недостаточно значений для распаковки (ожидалось 2, получено 1)

snuz 17.12.2020 12:08

Похоже, что линии между ними не пусты. Может, попробовать line.strip()?

Danny Staple 17.12.2020 12:17

Файл "autofind_OLT.py", строка 50, ключ автопоиска, значение = line.strip() ValueError: слишком много значений для распаковки (ожидается 2)

snuz 17.12.2020 12:24

Я отредактировал свое предложение - я хотел предложить вам снять линию, прежде чем она попадет в чеки и разделится.

Danny Staple 17.12.2020 17:08

Файл "autofind_OLT.py", строка 51, в ключе автопоиска значение = line.split(':') ValueError: недостаточно значений для распаковки (ожидалось 2, получено 1)

snuz 18.12.2020 12:24

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

Danny Staple 18.12.2020 12:29

Другие вопросы по теме