简体   繁体   English

csv文件中的标题每隔一行打印一次

[英]header in csv file printing every other line

I've been working this problem way too long, please explain to me why the header keeps repeating in my output csv.我一直在处理这个问题太久了,请向我解释为什么标题在我的输出 csv 中不断重复。

I have an input csv with this data:我有一个包含这些数据的输入 csv:

  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.该问题需要颠倒姓氏和名字,将名称分成两列,并为输出 csv 创建一个包含 3 列的新标题。 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:我的输出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).我试过删除while循环,取消缩进和缩进,用标题名称手动写一行(这会导致错误)。 Please help.请帮忙。 Thanks!谢谢!

You can add a variable that hold whether a header was printed or not, ex write_header您可以添加一个变量来保存是否打印了标题,例如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看看我如何使用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另一方面,您可以重构代码以在for循环之前打开 csv 编写器,在此处写入标头,然后像现在一样写入值,而无需每次要写入一行时都重新打开文件

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM