AlexW
AlexW

Reputation: 2587

Python determine a blank column in a csv

I'm making a config generating template in python, and it all works this far apart from my if row == '' section.

So I'm trying to check if a csv has blank data for the column BT and, if it's blank, remove any line that has the variable $BTSUB in it.

It's not working currently and I'm presuming it's because a csv empty column is not seen as '', does anyone know what it is seen as?

Also does anyone see any ways to improve what I have done below? (it's my first script)

Thanks Alex

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)

EDIT: debug output

{'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'
}

Upvotes: 0

Views: 1233

Answers (2)

Maresh
Maresh

Reputation: 4712

So the problem does not come from if row['BT'] == (''): but from your loop: for line in R1: When you do this:

R1 = R1Template.read()

R1 becomes a string. And when you loop on a string you get:

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

Therefore this condition will never be true (because line is just one character):

if '$BTSUB' not in line:

There're several way to fix this, the quickest, given your code structure is to change your for statement:

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

Although it's probably not the most efficient way.

If you need to keep the line return:

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

Or use a list and writelines()

Upvotes: 2

Thomas Lotze
Thomas Lotze

Reputation: 5313

You're reading the contents of the template file using R1Template.read(). This puts the complete contents (all lines concatenated) into the variable R1. The for loop over R1 then iterates over this string character by character, so the substring $BTSUB will never be found inside any of these one-character strings.

There are two possible solutions: either you read the template line by line, iterating over the file object R1Template, and apply the replacements to each line separately; or you keep reading the template as a whole and iterate its lines after all the replacing has been done; the list of lines will be R1.splitlines().

Upvotes: 1

Related Questions