Home > Software engineering >  header in csv file printing every other line
header in csv file printing every other line

Time:05-23

I've been working this problem way too long, please explain to me why the header keeps repeating in my output csv.

I have an input csv with this data:

  1. name,house
  2. "Abbott, Hannah",Hufflepuff
  3. "Bell, Katie",Gryffindor
  4. "Bones, Susan",Hufflepuff
  5. "Boot, Terry",Ravenclaw

The problem requires reversing last and first name, separate name into two columns, and make a new header with 3 columns for the output csv. Here's what I have:

    while True:
        try:
            # open file
            with open(sys.argv[1]) as file:
                # make reader
                reader = csv.reader(file)
                # skip first line (header row)
                next(reader)
                # for each row
                for row in reader:
                    # identify name
                    name = row[0]
                    # split at ,
                    name = name.split(", ")
                    # create var last and first, identify var house
                    last = name[0]
                    first = name[1]
                    house = row[1]


                    # writing the new csv
                    with open(sys.argv[2], "a") as after:
                        writer = csv.DictWriter(after, fieldnames=["first", "last", "house"])

                        # HEADER ONLY NEEDS TO OCCUR ONCE
                        writer.writeheader()
                        writer.writerow({"first": first, "last": last, "house": house})
                sys.exit(0)

my output csv:

  1. first,last,house
  2. Hannah,Abbott,Hufflepuff
  3. first,last,house
  4. Katie,Bell,Gryffindor
  5. first,last,house
  6. Susan,Bones,Hufflepuff

I've tried removing the while loop, unindenting and indenting, writing a row manually with the header names (which caused errors). Please help. Thanks!

CodePudding user response:

You can add a variable that hold whether a header was printed or not, ex write_header

while True:
    try:
        write_header = True
        # open file
        with open(sys.argv[1]) as file:
            # make reader
            reader = csv.reader(file)
            # skip first line (header row)
            next(reader)
            # for each row
            for row in reader:
                # identify name
                name = row[0]
                # split at ,
                name = name.split(", ")
                # create var last and first, identify var house
                last = name[0]
                first = name[1]
                house = row[1]


                # writing the new csv
                with open(sys.argv[2], "a") as after:
                    writer = csv.DictWriter(after, fieldnames=["first", "last", "house"])

                    # HEADER ONLY NEEDS TO OCCUR ONCE
                    if write_header:
                        writer.writeheader()
                        write_header = False
                    writer.writerow({"first": first, "last": last, "house": house})
            sys.exit(0)

See how i used write_header

On an other note, you can refactor your code to open the csv writer before the for loop, write headers there, then write values as you do now without the need to reopen the file each time you want to write a row

  • Related