使用 headers- F5 LTM 将文本解析为 python 中的 csv

Parsing text to csv in python with headers- F5 LTM

我正在尝试审核大量 f5 配置,但我很难解析下面的数据,我尝试修改下面的代码,但它抛出了一个错误。我是 python 的完全菜鸟,这是我第一次自动执行这样的任务。谢谢

数据:

Ltm::Virtual Server: acme.com
  Availability     : offline
  State            : enabled
  Reason           : The children pool member(s) are down
  Destination      : 10.1.1.2:80
Ltm::Virtual Server: foo.com
  Availability     : available
  State            : enabled
  Reason           : The virtual server is available
  Destination      : 10.100.11.15:80
Ltm::Virtual Server: hamhamspam.com
  Availability     : offline
  State            : enabled
  Reason           : The children pool member(s) are down
  Destination      : 10.200.8.17:443

预期输出

Virtual Server  Availability    State   Reason                                  Destination
acme.com        offline         enabled The children pool member(s) are down    10.1.1.2:80
foo.com         available       enabled The virtual server is available         10.100.11.15:80
hamhamspam.com  offline         enabled The children pool member(s) are down    10.200.8.17:443

import csv

def convert_to_dict(line, header):
    d = {}
    for cell in header:
        d[cell] = ''

    row = line.strip().split(':')
    for cell in row:
        if cell:
            key, value = cell.split(':')
            d[key] = value

    return d

def extract_fields(logfile):
    fields = set()
    for line in logfile:
        row = line.strip().split(':')
        for cell in row:
            if cell:
                key, value = cell.split(':')
                fields.add(key)

    logfile.seek(0)
    return sorted(list(fields))

if __name__ == '__main__':
    with open('ltm.txt', 'r') as logfile:
        with open('report.csv', 'wb') as csvfile:
            csvwriter = csv.writer(csvfile)

            header = extract_fields(logfile)
            csvwriter.writerow(header)

            for line in logfile:
                d = convert_to_dict(line, header)
                csvwriter.writerow([d[cell] for cell in header])

遇到错误:

error:
C:\Users\test\PycharmProjects\F5Parser\venv\Scripts\python.exe C:/Users/test/PycharmProjects/F5Parser/vip_ltm_parser
Traceback (most recent call last):
  File "C:/Users/test/PycharmProjects/F5Parser/vip_ltm_parser", line 33, in <module>
    header = extract_fields(logfile)
  File "C:/Users/test/PycharmProjects/F5Parser/vip_ltm_parser", line 22, in extract_fields
    key, value = cell.split(':')
ValueError: not enough values to unpack (expected 2, got 1)

Process finished with exit code 1

下面的工作代码:

lines_data = []
with open('ltm.txt', 'r') as logfile:
    pairs = {}
    for line in logfile:
        new_entry = False
        if line[0].isspace():
          fields = line.strip().split(':')
        else:
          double_colon_idx = line.find('::')
          line = line[double_colon_idx+2:]
          new_entry = True
        fields = line.strip().split(':')
        if new_entry and pairs:
          lines_data.append(pairs)
          pairs = {}
        if len(fields) >= 2:
          key = fields[0]
          value = fields[1]
          pairs[key.strip()] = value.strip()
    lines_data.append(pairs)
headers = lines_data[0].keys()
header_str = ','.join(headers)
with open('report.csv','w') as out:
  out.write(header_str + '\n')
  for entry in lines_data:
    _line = []
    for key in headers:
      _line.append(entry[key])
    out.write(','.join(_line) + '\n')

ltm.txt

Ltm::Virtual Server: acme.com
  Availability     : offline
  State            : enabled
  Reason           : The children pool member(s) are down
  Destination      : 10.1.1.2:80
Ltm::Virtual Server: foo.com
  Availability     : available
  State            : enabled
  Reason           : The virtual server is available
  Destination      : 10.100.11.15:80
Ltm::Virtual Server: hamhamspam.com
  Availability     : offline
  State            : enabled
  Reason           : The children pool member(s) are down
  Destination      : 10.200.8.17:443

report.csv

Virtual Server,Availability,State,Reason,Destination
acme.com,offline,enabled,The children pool member(s) are down,10.1.1.2
foo.com,available,enabled,The virtual server is available,10.100.11.15
hamhamspam.com,offline,enabled,The children pool member(s) are down,10.200.8.17

你的代码有不同的问题。

  1. 您尝试在 ':' 上拆分,而其中一个键确实包含冒号。你应该在 ': '

    上拆分
  2. 您一直尝试拆分两次,第一次是行(正确),然后是每个字段(错误)。您应该删除一个 split 并在拆分 之后删除

     ...
     for line in logfile:
         row = line.split(': ')
         key = row[0].strip()
         fields.add(key)
    

    其他功能相同

  3. 您分别处理每一行,而以 space 字符开头的行是续行。你应该只提取一对 key, value 和 return 它:

     def extract_pair(line):
         key, value = line.split(': ')
         return key.strip(), value.strip()
    

    然后在你的 main 中,你必须处理后续行

         ...
         d = None
         for line in logfile:
             key, value = extract_pair(line)
             if line[0].isspace():
                 d[key] = value       # continuation line: update d
             else:
                 if d is not None:    # write full previous row
                     csvwriter.writerow([d[cell] for cell in header])
                 d = {key: value}     # initial line: reset d
         if d is not None:            # process last row
             csvwriter.writerow([d[cell] for cell in header])