簡體   English   中英

csv文件中的標題每隔一行打印一次

[英]header in csv file printing every other line

我一直在處理這個問題太久了,請向我解釋為什么標題在我的輸出 csv 中不斷重復。

我有一個包含這些數據的輸入 csv:

  1. 名字,房子
  2. “雅培,漢娜”,赫奇帕奇
  3. “貝爾,凱蒂”,格蘭芬多
  4. “骨頭,蘇珊”,赫奇帕奇
  5. “布特,特里”,拉文克勞

該問題需要顛倒姓氏和名字,將名稱分成兩列,並為輸出 csv 創建一個包含 3 列的新標題。 這是我所擁有的:

    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)

我的輸出csv:

  1. 第一個,最后一個,房子
  2. 漢娜、雅培、赫奇帕奇
  3. 第一個,最后一個,房子
  4. 凱蒂、貝爾、格蘭芬多
  5. 第一個,最后一個,房子
  6. 蘇珊,骨頭,赫奇帕奇

我試過刪除while循環,取消縮進和縮進,用標題名稱手動寫一行(這會導致錯誤)。 請幫忙。 謝謝!

您可以添加一個變量來保存是否打印了標題,例如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)

看看我如何使用write_header

另一方面,您可以重構代碼以在for循環之前打開 csv 編寫器,在此處寫入標頭,然后像現在一樣寫入值,而無需每次要寫入一行時都重新打開文件

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM