У меня есть этот ввод для обработки:
['', '', '', '', ' Huawei Integrated Access Software (MA5600T).', ' Copyright(C) Huawei Technologies Co., Ltd. 2002-2014. All rights reserved.', '', ' -----------------------------------------------------------------------------', ' User last login information:', ' -----------------------------------------------------------------------------', ' Access Type : Telnet ', ' IP-Address : 1.1.1.1', ' Login Time : 2020-12-24 11:51:33+01:00', ' Logout Time : 2020-12-24 11:51:38+01:00', ' -----------------------------------------------------------------------------', '', 'OLT-SALUZZO_01>enable', '', 'OLT-SALUZZO_01#display ont autofind all \x1b[1D\x1b[1C', ' ----------------------------------------------------------------------------', ' 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-24 08:38:28+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', "---- More ( Press 'Q' to break ) ----"]
и мне нужно создать из этого вывод следующим образом:
[{'F/S/P': '0/17/7', 'SN': ' 485754437D85CA9E', 'Password': None}, {'F/S/P': '0/17/7', 'SN': '48575443A9517A9E ', 'Password': None}]
Моя функция примерно такая:
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()
autofind_list=[]
records = []
current_record = {}
for line in data_return:
line = line.strip()
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
print(current_record)
if "Ont SN" in line:
key, value = line.split(':')
key = key.strip()
value = value.strip()
value = re.sub(r'\(.*\)', '', value)
current_record[key] = value
print(current_record)
if "Password" in line:
key, value = line.split(':')
key = key.strip()
value = value.strip()
if value == '0x00000000000000000000':
current_record[key]=None
else:
current_record[key] = value
autofind_list.append(current_record.copy())
#for removing same records
seen = set()
new_l = []
for d in autofind_list:
t = tuple(d.items())
if t not in seen:
seen.add(t)
new_l.append(d)
print(new_l)
Но он возвращает это, я почти достиг своей цели:
[{}, {'F/S/P': '0/17/7'}, {'F/S/P': '0/17/7', 'Ont SN': '485754437D85CA9E '}, {'F/S/P': '0/17/7', 'Ont SN': '485754437D85CA9E ', 'Password': None}, {'F/S/P': '0/17/7', 'Ont SN': '48575443A9517A9E ', 'Password': None}]
Но я хотел бы удалить бесполезный объект, такой как {}, {'F/S/P': '0/17/7'}
Кто-нибудь может помочь мне с этой проблемой? или может подскажете?
заранее спасибо
(Примечание: ни один из них не является JSON, который поддерживает только строки в двойных кавычках и использует null
, а не None
. Я подозреваю, что у вас действительно есть списки Python, содержащие словари.)
Этот вывод одинаков каждый раз, если вы читаете
Да, мне понадобится json или что-то подобное, я думаю, что мой вопрос вполне ясен
«Если вы читаете, этот вывод каждый раз один и тот же» — значит, вы ожидаете, что мы заметим разницу между «485754437D85CA9E» и «48575443A9517A9E», скрытую в длинных выводах, которые нам нужно прокручивать вбок, чтобы прочитать? Еще раз, пожалуйста, прочитайте Как спрашивать , особо отметив рекомендацию «представить, что вы разговариваете с занятым коллегой». Различия в этих значениях должны быть четко указаны в вашем вопросе. И в идеале вы должны предоставить минимальный воспроизводимый пример. Здесь много кода, который ничего не делает, кроме как отвлекает.
Кроме того, исправьте код Python. Как сейчас написано, он сгенерирует IndentationError
. Сколько этого должно быть в теле autofind()
? Вставьте свой код, затем выберите его и нажмите кнопку {}
или нажмите Ctrl+K, чтобы отформатировать его как код.
Проблема здесь в том, что у вас есть только один autofind_object
, и вы постоянно перезаписываете его. Попробуйте переместить autofind_object = {}
в свой цикл или заменить autofind_list.append(autofind_object)
на autofind_list.append(autofind_object.copy())
.
Возможный дубликат Список неожиданно меняется после назначения. Как мне клонировать или скопировать его, чтобы предотвратить это?
@Chris Большое спасибо, как я могу удалить бесполезные объекты, такие как {} или что-то вроде {'F/S/P': '0/17/7'} без всех необходимых мне параметров?
@ Крис, не могли бы вы перепроверить мой вопрос? Я отредактировал это... Спасибо
Вставьте свой autofind_list.append(current_record.copy())
в блок else
, чтобы он работал только тогда, когда line
соответствует действительности.
Я не уверен, что вы планировали с этим autofind_list
, но я предполагаю, что это была ваша попытка решить проблему, связанную с отсутствием одной записи в records
. Это можно решить, просто добавив current_record
после завершения цикла.
Тогда единственная проблема - это первая пустая запись, потому что в начале есть ненужная пустая строка. Это можно сделать, просто проверив, заполнена ли current_record
, прежде чем добавлять ее в records
(это также предотвращает проблемы, если две пустые строки идут подряд).
Вот полный код:
records = []
current_record = {}
for line in data_return:
line = line.strip()
if not line: # empty line
if current_record: # no data recorded
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
if "Ont SN" in line:
key, value = line.split(':')
key = key.strip()
value = value.strip()
value = re.sub(r'\(.*\)', '', value)
current_record[key] = value
if "Password" in line:
key, value = line.split(':')
key = key.strip()
value = value.strip()
if value == '0x00000000000000000000':
current_record[key] = None
else:
current_record[key] = value
if current_record:
records.append(current_record)
records
теперь включает в себя список, я думаю, вы хотите.
Поскольку данные вашего примера в сообщении на самом деле не представляют введенные вами данные, в которых записи разделены ----
линиями, состоящими только из тире, вам нужно заменить if not line:
на if not line or set(line) == {'-'}:
.
он возвращает только одну запись: [{'F/S/P': '0/17/7', 'Ont SN': '48575443A9517A9E', 'Пароль': None}]
@snuz Это не для меня. Можете ли вы привести пример ввода? Через пастебин?
все это описано в вопросе, ввод, который мне нужно обработать, это первое, что я написал в вопросе
@snuz И этот ввод работает для меня. Вы уверены, что у вас есть последние несколько строк моего ответа?
Да. Я уверен! если я печатаю «записи», он печатает только «[{'F/S/P': '0/17/7', 'Ont SN': '48575443A9517A9E', 'Пароль': None}]'
@snuz Ну, можешь добавить print(data_return)
и дать мне результат?
Он добавляет только последнюю текущую запись вашего кода
@snuz У меня работает, значит, что-то с твоей стороны не так. Поскольку единственное сообщение об ошибке, которое я получаю от вас, это «это не работает», я не могу вам помочь.
Куда я могу отправить вам вывод?
@snuz Эти данные в другом формате. Записи разделены строками, содержащими только дефисы.
да, я знаю, но почему он вообще может читать записи?
Если я распечатаю current_record, все в порядке
@snuz Код добавляется к records
только в пустой строке, так как вы сказали мне, что это правильно.
@snuz Я добавил код в ответ. Тогда это работает?
@snuz Также, пожалуйста, обновите свой вопрос, чтобы он содержал фактический ввод, а не то, что вы считаете вводом.
Извините... Я хотел бы спросить вас напоследок, как я могу получить доступ к предметам? Например для получения только 17.00.7 из записей?
@snuz Я не уверен, что ты имеешь в виду. Вы можете открыть новый вопрос, если это что-то новое.
Я имею в виду получение значения в списке
«каждый раз что-то не так, например вот это» — в чем конкретная проблема с этим выводом? Пожалуйста, прочтите Как спросить. Сделайте это как можно проще для нас, чтобы помочь вам.