Python – Problem in appending lines to output file with specific condition

Question:

My Problem is the following:

I have a file with lines that normally start with ‘ab’, condition is when line not start with ab it should be appended to previous line, but some lines are not get appended to output file

Source File:
grpid;UserGroup;Name;Description;Owner;Visibility;Members -> heading
ab;user1;name1;des1;bhalji;public
sss
ddd
fff
ab;user2;name2;des2;bhalji;private -> not appended in output

ab;user3;name3;des3;bhalji;public -> not appended in output

ab;user4;name4;des4;bhalji;private
rrr
ttt
yyy
uuu

ab;user5;name5;des5;bhalji;private
ttt
ooo
ppp

Here’s is what I’m doing using python:

def grouping():
    output = []
    temp = []
    currIdLine = ""
    with( open ('usergroups.csv', 'r')) as f:
        for lines in f.readlines(): 
            line = lines.strip()
            if not line:
               print("Skipping empty line")
               continue 
            if line.startswith('grpid'): 
               output.append(line)
               continue 
            if line.startswith('ab'):
                if temp:
                   output.append(currIdLine + ";" + ','.join(temp))
                   temp.clear()
                currIdLine = line
            else:
                temp.append(line)
    output.append(currIdLine + ";" + ','.join(temp))

        #print("n".join(output))
        
        with open('new.csv', 'w') as f1:
            for row in output:
                f1.write(row + 'n')

grouping ()

Output of the above code:
grpid;UserGroup;Name;Description;Owner;Visibility;Members
ab;user1;name1;des1;bhalji;public;sss,ddd,fff
ab;user4;name4;des4;bhalji;private;rrr,ttt,yyy,uuu
ab;user5;name5;des5;bhalji;private;ttt,ooo,ppp

I hope this should be quite easy with Python but I’m not getting it right so far.

That’s how the file should look at the end:

Expected Output:
grpid;UserGroup;Name;Description;Owner;Visibility;Members
ab;user1;name1;des1;bhalji;public;sss,ddd,fff
ab;user2;name2;des2;bhalji;private
ab;user3;name3;des3;bhalji;public
ab;user4;name4;des4;bhalji;private;rrr,ttt,yyy,uuu
ab;user5;name5;des5;bhalji;private;ttt,ooo,ppp
Asked By: Bhalaji NM

||

Answers:

You are close. Missing an else statement to deal with the case that the line starts with ab, and the previous line started with ab.

def grouping():
    output = []
    temp = []
    currIdLine = ""
    with(open('usergroups.csv', 'r')) as f:
        header = f.readline()
        output.append(line.strip())
        temp = []
        for line in f.readlines():
            if not line:
                print("Skipping empty line")
                continue
            if line.startswith('ab'):
                if temp:
                    output.append(currIdLine + ";" + ','.join(temp))
                    temp = []
                else:
                    output.append(currIdLine)
                currIdLine = line.strip()
            else:
                temp.append(line.strip())
    if temp:
        output.append(currIdLine + ";" + ','.join(temp))
    else:   # <-- this block is needed
        output.append(currIdLine)
       

    with open('new.csv', 'w') as f1:
        for row in output:
            f1.write(row + 'n')
Answered By: WombatPM
Categories: questions Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.