我在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'
}
答案 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))
或使用list
和writelines()
答案 1 :(得分:1)
您正在使用R1Template.read()
阅读模板文件的内容。这将完整的内容(所有行连接)放入变量R1
。 for
上的R1
循环然后逐个字符地遍历此字符串,因此在任何这些单字符字符串中永远不会找到子字符串$BTSUB
。
有两种可能的解决方案:要么逐行读取模板,遍历文件对象R1Template
,要么将替换分别应用于每一行;或者你继续阅读模板作为一个整体,并在所有替换完成后迭代它的行;行列表将为R1.splitlines()
。