Назначение значений переменных на основе результатов поиска из текстового файла - PullRequest
0 голосов
/ 05 ноября 2018

Я начинающий программист (если что!) я работаю над простым проектом на работе, который проглотит файл конфигурации сетевого коммутатора HP и выложит png-изображение коммутатора с цветными портами, которые соответствуют цвету vlan, связанному с этими портами

В настоящее время у меня это отлично работает в ручном режиме.

Я импортирую пустой файл png переключателя затем я указываю текущий цвет портов коммутатора для интерфейсов 1 и 2 Затем я указываю цвет VLAN, который я хочу назначить им. я запускаю команду, которая говорит: «Если какие-либо пиксели в изображении соответствуют цветам x, x, x, то измените их на значение trunkport» затем выплюнуть этот новый файл изображения с изменением цвета

вот пример:

import cv2
import numpy as np

SwitchImage = cv2.imread("BlankSwitchXX.png",1)

interface1 = [0,0,1]
interface2 = [0,0,2]

trunkport = [0,165,255]

SwitchImage[np.where((SwitchImage == interface1).all(axis = 2))] = trunkport
SwitchImage[np.where((SwitchImage == interface2).all(axis = 2))] = trunkport

cv2.imwrite("SwitchXX.png",SwitchImage) 

это работает просто отлично, однако конечная цель - использовать файл конфигурации переключателя для выполнения этих назначений.

эти файлы cfg полны бесполезного текста, но есть одна группа строк, которая им интересна

они выглядят так

trunk 1,2 Trk1 LACP

Я хотел спросить, есть ли способ найти в этом .txt-файле строку «ствол», а затем, если он попадет в ствол, посмотреть на следующие числа, следующие за ним. это видит

1,2

и интерпретирует их так же, как

interface1
interface2

затем присвойте этим переменным значение "trunkport".

Надеюсь, это имеет смысл, пожалуйста, дайте мне знать, если нет. Идея заключается в том, что большое количество коммутаторов будут использовать один и тот же формат конфигурации, и эту программу можно использовать для визуального отображения цветов vlan с использованием только файла cfg.

любая помощь будет очень признательна !!

1 Ответ

0 голосов
/ 05 ноября 2018

Вы можете сопоставить интересующие вас строки, используя модуль re. Если ваши данные находятся в файле с именем data.txt, вы можете получить его как:

import re
with open('test.txt', 'r') as f:
    lines = f.readlines()
p = re.compile('^trunk')
matches = [l for l in lines if p.match(l)]
#output: ['trunk 1,2 Trk1 LACP\n']

Теперь у вас есть список строк, начинающихся с 'trunk'. Смотрите https://docs.python.org/3/library/re.html#module-re для деталей о том, как сделать регулярное выражение в Python.

Теперь вы можете получить числа, если они находятся сразу после «ствола», вот так:

numbers = [m.split(' ')[1].split(',') for m in matches]
#output: [['1', '2']]

(Это также можно сделать с помощью регулярного выражения, как предполагает Idlehands).

Наконец, вы можете добавить эти цифры в диктовку, чтобы получить к ним доступ

{'interface' + x:'trunkport' for interfaces in numbers for x in interfaces}
#output: {'interface1': 'trunkport', 'interface2': 'trunkport'}
...