【问题标题】:Assigning variable values based on search results from a txt file根据 txt 文件中的搜索结果分配变量值
【发布时间】:2019-04-08 20:14:55
【问题描述】:

我是一名新手程序员(如果那样的话!) 我正在做一个简单的项目,它将吞下 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) 

这很好用,但最终目标是使用 switch 配置文件来进行此分配。

这些 cfg 文件充满了无用的文本,但有一组我感兴趣的行

它们看起来像这样

trunk 1,2 Trk1 LACP

我想问是否有办法在这个 .txt 文件中搜索字符串“trunk”,然后如果它在trunk 上被命中,请查看它后面的下一个数字。它看到了

1,2

并将它们解释为与

相同
interface1
interface2

然后将“trunkport”的值分配给这些变量。

我希望这是有道理的,如果没有,请告诉我。这背后的想法是大量交换机将共享相同格式的配置,并且该程序可用于仅使用 cfg 文件直观地映射 vlan 颜色。

任何帮助将不胜感激!

【问题讨论】:

  • 一个文本文件主要是一个大字符串(如果您一次阅读)或一系列较小的字符串(如果您逐行阅读),所以如果您可以从字符串中提取这些信息您可以从文件中提取它们。字符串有很多有用的方法(搜索、拆分等),如果您有更复杂的需求,还有re 模块。至于最后一部分 - “分配给这些变量” - 你可能想要使用列表或字典(提示:当你有名为“foo1”,“foo2”,“fooXXX”的变量时,你当然想要一个列表或dict 代替)。
  • 嗨!感谢您提供的信息,虽然您所说的有些道理,但我不确定我将如何实施。你是说有一个列表或字典,而不是一长串名为 interface1 interface2 interface3 etc 的变量?
  • trunk 在 cfg 中总是一个唯一的词吗?如果是这样,它会让你的生活更轻松。您可以按照@brunodesthuilliers 的建议使用re 模块并搜索模式'trunk (\d+),(\d+) Trk' 并使用返回的组1 (1) 和2 (2) 来匹配您的接口值。如果它们匹配,则继续分配trunkport。如果不是这种情况,提供一些样本会有所帮助。
  • trunk 是一个独特的词,是的,但它可能有多个实例。即便如此,每个实例都将具有格式 trunk 1,2 Trk1 LACP

标签: python variables colors pixel switching


【解决方案1】:

您可以使用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”开头的行列表。有关如何在 Python 中执行正则表达式的详细信息,请参阅 https://docs.python.org/3/library/re.html#module-re

现在您可以像这样获取紧跟在“主干”之后的数字:

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'}

【讨论】:

  • 文件是可迭代的,所以你不需要一次在内存中读取它们
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-22
  • 1970-01-01
  • 1970-01-01
  • 2020-12-26
  • 1970-01-01
  • 2021-08-08
  • 1970-01-01
相关资源
最近更新 更多