使用Python 2.7中的CSV lib将CSV文件中的数据排序到它所属的列

时间:2016-11-24 19:44:37

标签: python python-2.7 sorting csv

之前我已经打开过这个主题:Append continuous data to the same row using CSV lib, in Python

有人为我提出了一个解决方案,这个解决方案效果很好。该代码表明它的工作原理如下:

import csv

filewrite.writerow(['Hostname', 'Config-Error', 'Config-Error'])
with open(outputfile, 'a') as csvfile:
    filewrite = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_MINIMAL)
    row = [hostname]
    if (CiscoSyslog == 0):
        row.append('Syslog')
    if (CiscoSNMP == 0):
        row.append('SNMP')
    filewrite.writerow(row)

输出符合要求:

hostname,Config-Error,Config-Error
router1,Syslog
router2,SNMP
router3,Syslog,SNMP

现在,我的下一个问题是,您如何将附加数据添加到一行,并将其排序为属于某一列?例如,我想在顶部的两列上说“Config-Error”,而不是在顶部的一列说SyslogError,而另一列是SNMPError,所以它看起来像:

hostname,SyslogError,SNMPError
router1,Syslog, ,
router2, ,SNMP
router3,Syslog,SNMP

我的最终目标是匹配将在配置中找到的错误,将其附加到CSV文件,并在正确的列上对其进行排序。我甚至不确定如何“谷歌搜索”这个,所以我决定在这里提出问题。

我对python还是一个新手,但到目前为止学习很有趣。

提前谢谢!

1 个答案:

答案 0 :(得分:0)

答案很简单,它在我眼中“盯着”。 :)

基本上,我摆脱了“if”语句,其中数据附加在一行下。我还包括了一些我的代码,所以它完全有道理,以防有人在寻找类似谜题的答案。

所以...我设置标志以“是”开头(正如您在代码中看到的那样)。如果找不到每个变量(Syslog,SNMP和Tacacs)的某些语句,它们都将保持设置为“Yes”。我执行“re.search”方法,如果它在配置下找到语句,则将其标记为“No”,因此不需要将其打印到输出文件(或者换句话说,配置存在,所以有“No”配置错误)。对于仍然保留为“是”的任何标志,我每次打印出每个“标志”(在这种情况下为变量)按顺序,这样它就会进入正确的列< /强>

以下是代码:

import csv
import re


Syslog = 'logging 1.1.1.1'
SNMP = 'snmp-server host 2.2.2.2'
Tacacs = 'tacacs-server host 3.3.3.3'

filewrite.writerow(['Hostname', 'SyslogError', 'SNMPError', 'TacacsError'])

with open(file, 'r') as inFile:
    SyslogFlag = 'Yes'
    SNMPFlag = 'Yes'
    TacacsFlag = 'Yes'

    for line in inFile:
        if re.search(Syslog, line):
            SyslogFlag = 'No'
        if re.search(SNMP, line):
            SNMPFlag = 'No'
        if re.search(Tacacs, line):
            TacacsFlag = 'No'

    if (SyslogFlag == 'No') and (SNMPFlag == 'No') and (TacacsFlag == 'No'):
        print "No Config errors"
    else:
        with open(outputfile, 'a') as csvfile:
            filewrite = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_MINIMAL)
            row = [hostname]
            row.append(SyslogFlag)
            row.append(SNMPFlag)
            row.append(TacacsFlag)
            filewrite.writerow(row)

这是输出:

Hostname,SyslogError,SNMPError,TacacsError
router1,Yes,No,No
router2,No,Yes,No
router3,Yes,Yes,No