Python确定csv中的空白列

时间:2016-03-14 12:15:23

标签: python csv python-3.x

我在python中创建了一个配置生成模板,除了我的if row == ''部分之外,这一切都很有效。

所以我试图检查csv是否有BT列的空白数据,如果它是空白的,则删除其中包含变量$BTSUB的任何行。

它目前无效,我认为这是因为csv空列不被视为'',有人知道它被视为什么?

也有人看到任何方法来改善我在下面所做的事情吗? (这是我的第一个剧本)

由于 亚历

import csv
import os
with open('Data/ShowroomData.csv', 'rt') as Data:
    SR = csv.DictReader(Data, delimiter=',', quotechar='|')
    for row in SR:
        # if you were to print just `row`, you would get a dictionary

        # set config file path
        folder  = 'Data/'
        filename = row['Host']
        path = folder + '/' + filename
        file = path + '/STR-' + filename + '-RTR-01.txt'
        # check if path exists if not make path
        if not os.path.exists(path):
            os.makedirs (path)
        # Read in the config file
        R1 = None
        with open('Data/STR-RTR-01.txt', 'r') as R1Template, open(file, 'w') as configfile:
            R1 = R1Template.read()

            # Replace the target string
            R1 = R1.replace('$STR', row['Host'])
            R1 = R1.replace('$IP', row['Subnet'])
            R1 = R1.replace('$DMVPN-DSL', row['DMVPN-DSL'])
            R1 = R1.replace('$DMVPN-4G', row['DMVPN-4G'])
            R1 = R1.replace('$BGPASNO', row['BGPAS'])
            R1 = R1.replace('$KCIP', row['KCIP'])
            R1 = R1.replace('$WRIP', row['WRIP'])
            R1 = R1.replace('$LOIP', row['Loopback'])              
            R1 = R1.replace('$DSL-USER', row['DSL-USER'])
            R1 = R1.replace('$DSL-PASS', row['DSL-PASS'])
            R1 = R1.replace('$Date', row['InstallDate'])

            if row['BT'] == (''):
                for line in R1:
                    if '$BTSUB' not in line:
                        # Write file without Static Routes
                        configfile.write(line)
            else:
                R1 = R1.replace('$BTSUB', row['BT'])
                # Write the file 
                configfile.write(R1)

编辑:调试输出

{'DMVPN-DSL': '79', 'DSL-PASS': '', 
 'Host': 'TEST', 'DSL-USER': '',
 'InstallDate': '', 'BGPAS': 'XXX', 'BT': '', 
 'Loopback': '172.X.X.X', 'KCIP': '172.XX.X.X', 
 'WRIP': '172.X.X.X', 'Location': 'Test', 
 'DMVPN-4G': '162', 'Subnet': '137'
}

2 个答案:

答案 0 :(得分:2)

所以问题不是来自if row['BT'] == (''):,而是来自你的循环:for line in R1: 当你这样做时:

R1 = R1Template.read()

R1成为一个字符串。当你循环上一个字符串时,你会得到:

In [69]: for line in "abcd":
   ....:     print(line)
a
b
c
d

因此,这种情况永远不会成立(因为line只是一个字符):

if '$BTSUB' not in line:

有几种方法可以解决这个问题,最快的是,鉴于您的代码结构是更改for语句:

for line in R1.split('\n'): # If it's unix-like line endings

虽然这可能不是最有效的方法。

如果你需要保持线路返回:

configfile.write("{}\n".format(line))

或使用listwritelines()

答案 1 :(得分:1)

您正在使用R1Template.read()阅读模板文件的内容。这将完整的内容(所有行连接)放入变量R1for上的R1循环然后逐个字符地遍历此字符串,因此在任何这些单字符字符串中永远不会找到子字符串$BTSUB

有两种可能的解决方案:要么逐行读取模板,遍历文件对象R1Template,要么将替换分别应用于每一行;或者你继续阅读模板作为一个整体,并在所有替换完成后迭代它的行;行列表将为R1.splitlines()