代码之家  ›  专栏  ›  技术社区  ›  user7995721

python删除行startswith MAC&TOTAL并打印第一个值或索引0

  •  0
  • user7995721  · 技术社区  · 7 年前

    我试图从文本文件中过滤MAC地址,因为它有许多字段,如MAC、地址、端口等。。我刚刚在下面尝试了一下,但它生成了一个列表输出 其中有空白列表行和起始行 TOTAL MAC 我想删除它,我用我的第一个代码尝试了一下,我已经注释了这行,但它不起作用。

        #!/usr/bin/env python
        with open('device', 'r' ) as fopen:
          readMac = fopen.read().splitlines()
          for line in readMac:
            getMAC = line.upper().split()
              #if getMAC[0] not in ('TOTAL', 'MAC'):
            print getMAC
    

    下面是其生成的代码输出。。

    bash-4.1$ ./maclist2.py
    ['TOTAL', 'ACTIVE', 'ENTRIES', 'FROM', 'ALL', 'PORTS', '=', '312']
    ['MAC', 'ADDRESS', 'PORT', 'AGE', 'VLAN', 'TYPE']
    []
    ['0004.5G0B.54DA', '11/40', '0', '174']
    ['24B6.FGG8.05EC', '10/7', '0', '174']
    ['MAC', 'ADDRESS', 'PORT', 'AGE', 'VLAN', 'TYPE']
    []
    

    line.startswith 功能和it

        bash-4.1$ cat maclist.py
        #!/usr/bin/env python
    
        with open('device', 'r' ) as fopen:
            for line in fopen.read().splitlines():
              if not line.startswith('TOTAL', 'MAC'):
                print line.upper()
    
    bash-4.1$ ./maclist.py
    Traceback (most recent call last):
      File "./maclist.py", line 5, in <module>
        if not line.startswith('TOTAL', 'MAC'):
    TypeError: slice indices must be integers or None or have an __index__ method
    

    不过,当我只使用 if not line.startswith('MAC'): 然后删除以 雨衣 但是另一行 空白行仍然存在。

    bash-4.1$ ./maclist.py | more
    TOTAL ACTIVE ENTRIES FROM ALL PORTS = 312
    
    0004.5G0B.54DA 11/40        0       174
    24B6.FGG8.05EC  10/7        0       174
    
    45B6.FUT8.009C  10/7        0       174
    

    文件示例:

    bash-4.1$ cat device | more
    Total active entries from all ports = 312
    MAC Address     Port      Age      VLAN    Type
    
    0004.5G0B.54DA 11/40        0       174
    24B6.FGG8.05EC  10/7        0       174
    MAC Address     Port      Age      VLAN    Type
    

    45B6.FUT8.009C 10/7 0 174

    2 回复  |  直到 7 年前
        1
  •  0
  •   Kyle    7 年前

    我认为使用re模块将MAC地址与正则表达式匹配是最简单的。格式非常一致,所以我认为这可能是解析它们的最简单方法。下面是我的示例。我正在使用您问题中的一组样本数据,并将其放入一个名为sample\u data的文件中。txt。我的解决方案返回 [0004.5G0B.54DA',24B6.FGG8.05EC']

    笔记 :我不是正则表达式向导,但这应该可以完成工作。

    import re
    
    
    def get_data():
        pattern = re.compile(r'[a-z|A-Z|0-9]{4}\.[a-z|A-Z|0-9]{4}\.[a-z|A-Z|0-9]{4}')
        mac_addresses = None
    
        with open('sample_data.txt', 'r') as data_file:
            raw_data = data_file.read()
            results = pattern.findall(raw_data)
            mac_addresses = results
    
        return mac_addresses
    
    if __name__ == '__main__':
        mac_addresses = get_data()
        [print(a) for a in mac_addresses]
    
        2
  •  0
  •   user7995721 user7995721    7 年前

    re 另一个是 s.startswith 作用如果能再好一点,请告诉我。。

    1) 第一个代码 重新

    #!/usr/bin/python3.6
    import re
    for line in open('device'):
      line = line.strip()
      if line != '':
        if not re.match(r'(Total|MAC)', line):
          getMac = line[:15]
          getPort = line[15:20]
          getSub = line[36:40]
          #getMAC = line[15:20]
          print(getMac.upper())
          #print(getPort.upper())
          #print(getSub.upper())
    

    startswith 单元

    #!/usr/bin/python3.6
    with open("device", "r") as f:
        for line in f:
            data = line.strip()
            if data: # is not empty
              raw_data2 = data
              if not raw_data2.startswith(('Total', 'MAC')):
                getMac = raw_data2[:15]
                print(getMac.upper())