分割列表后加入相关项目

时间:2018-06-13 09:58:12

标签: python csv

我正在处理一个脚本,该脚本将文本文件中的文本解析为CSV文件以实现此目的我正在使用CSV库。

至于此任务的背景,我需要大约一百个开关,我需要拉序列号& PIDVID 关闭;我通过我编写的脚本在Cisco交换机上运行该命令,然后将所有输出写入文本文件(有关文本文件可能的示例,请参见下文)

switch# show inventory 
NAME: "Chassis", DESCR: "Nexus5020 Chassis"
PID: N5K-C5020P-BF     , VID: V04 , SN: SSI13390FZT

正如您从上面的文本文件中看到的那样,当我尝试将其写入CSV文件时,问题就已经很好了。当我将其写入CSV文件时,我面临的问题是每个项目都放在一个单独的列中,但是,我需要相关项目出现在同一列中,下面是我目前实现这一目标的解决方案。

with open(inputFile) as IFR:
    inputFileLines = list(IFR)

    bannedStrings = ['switch# show inventory', 'NAME:']
    bannedString = ''.join(bannedStrings)

    for inputFileLines in inputFileLines:
        if bannedString in inputFileLines:
            inputFileLines.remove(bannedString)
    print(inputFileLines)


listSplit = inputFileLines.split()

listItemA = listSplit[0] + listSplit[1] + listSplit[2] + listSplit[3] + 
listSplit[4]
listItemC = listSplit[5] + listSplit[6] + listSplit[7]

liA = listItemA.replace(',', ' ')
liC = listItemC.replace(',', ' ')

CFR = csv.writer(open('Output.csv', 'a'))
CFR.writerow([liA, liC])

通过查看代码,您可以看到这是令人难以置信的效率低下的方法,因为这需要我输入的每个文本文件看起来都相同,所以每个列表项都在相同的地方,没有更多的清单项目,因为我没有考虑那些根据他们在拆分清单中的当前位置连接相关项目的那些。

以下是通过我的脚本运行文本文件后CSV文件的样子。

enter image description here

我的挑战 - 什么是确保拆分列表中的相关项目显示在同一列中的更好方法?

1 个答案:

答案 0 :(得分:1)

使用Python的CSV library读取您的文本文件。这将根据逗号的位置为您提供每行分割的值列表。

每个开关条目似乎只包含两行信息,因此可以根据每行中找到的元素数量读取这些信息,如下所示:

import csv

with open('input.csv', newline='') as f_input, open('output.csv', 'w', newline='') as f_output:
    csv_input = csv.reader(f_input)
    csv_output = csv.writer(f_output)
    csv_output.writerow(['NAME', 'DESCR', 'PID', 'VID', 'SN'])

    for row in csv_input:
        if len(row) == 2:
            row1 = [v.split(':')[1].replace('"', '').strip() for v in row] 
        elif len(row) == 3:
            row2 = [v.split(':')[1].replace('"', '').strip() for v in row] 
            csv_output.writerow(row1 + row2)

给你output.csv包含:

NAME,DESCR,PID,VID,SN
Chassis,Nexus5020 Chassis,N5K-C5020P-BF,V04,SSI13390FZT
Chassis,Nexus5020 Chassis,N5K-C5020P-BF,V04,SSI13390FZT
Chassis,Nexus5020 Chassis,N5K-C5020P-BF,V04,SSI13390FZT

我的输出假定您的文件包含多个类似的条目。如果不需要机箱信息:

import csv

with open('input.csv', newline='') as f_input, open('output.csv', 'w', newline='') as f_output:
    csv_input = csv.reader(f_input)
    csv_output = csv.writer(f_output)
    csv_output.writerow(['PID', 'VID', 'SN'])

    for row in csv_input:
        if len(row) == 3:
            csv_output.writerow(v.split(':')[1].replace('"', '').strip() for v in row)