You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CS50第六套作业scourgify无法通过check50检测求助

问题:CS50 Scourgify作业测试无法通过,代码运行正常

我检查后发现代码运行完全正常,但始终无法通过CS50的scourgify作业测试。我也没有忽略逗号分隔的姓名间的空格。

以下是我的代码:

import sys
import csv

def main():
    n, m = passing_arg()
    read_file(n, m)

def passing_arg():
    if len(sys.argv) > 3:
        sys.exit("Too many command-line arguments")

    elif len(sys.argv) < 3:
        sys.exit("Too few command-line arguments")

    elif sys.argv[1].endswith(".csv") == False or sys.argv[2].endswith(".csv") == False:
        sys.exit("Not a CSV file")

    else:
        x = sys.argv[1]
        y = sys.argv[2]
        return x, y

def read_file(x, y):
    try:
        with open(x) as file:
            content = csv.DictReader(file)
            print(type(content))
            add_header = True
            for row in content:
                last, first = row["name"].split(", ")

            with open(y, "a") as f:
                fieldnames = ['First', 'Last', 'House']
                content1 = csv.DictWriter(f, fieldnames=fieldnames)
                if add_header:
                    content1.writeheader()
                    add_header = False
                 content1.writerow({fieldnames[0] : first, fieldnames[1] : last, fieldnames[2] : row["house"]})


    except FileNotFoundError:
        sys.exit(f"Could not read {x}")


if __name__ == "__main__":
    main()

输入文件BEFORE:

name,house
"Abbott, Hannah",Hufflepuff
"Bell, Katie",Gryffindor
"Bones, Susan",Hufflepuff
"Boot, Terry",Ravenclaw
"Brown, Lavender",Gryffindor
"Bulstrode, Millicent",Slytherin
"Chang, Cho",Ravenclaw
"Clearwater, Penelope",Ravenclaw
"Crabbe, Vincent",Slytherin
"Creevey, Colin",Gryffindor
"Creevey, Dennis",Gryffindor
"Diggory, Cedric",Hufflepuff
"Edgecombe, Marietta",Ravenclaw
"Finch-Fletchley, Justin",Hufflepuff
"Finnigan, Seamus",Gryffindor
"Goldstein, Anthony",Ravenclaw
"Goyle, Gregory",Slytherin
"Granger, Hermione",Gryffindor
"Johnson, Angelina",Gryffindor
"Jordan, Lee",Gryffindor
"Longbottom, Neville",Gryffindor
"Lovegood, Luna",Ravenclaw
"Lupin, Remus",Gryffindor
"Malfoy, Draco",Slytherin
"Malfoy, Scorpius",Slytherin
"Macmillan, Ernie",Hufflepuff
"McGonagall, Minerva",Gryffindor
"Midgen, Eloise",Gryffindor
"McLaggen, Cormac",Gryffindor
"Montague, Graham",Slytherin
"Nott, Theodore",Slytherin
"Parkinson, Pansy",Slytherin
"Patil, Padma",Gryffindor
"Patil, Parvati",Gryffindor
"Potter, Harry",Gryffindor
"Riddle, Tom",Slytherin
"Robins, Demelza",Gryffindor
"Scamander, Newt",Hufflepuff
"Slughorn, Horace",Slytherin
"Smith, Zacharias",Hufflepuff
"Snape, Severus",Slytherin
"Spinnet, Alicia",Gryffindor
"Sprout, Pomona",Hufflepuff
"Thomas, Dean",Gryffindor
"Vane, Romilda",Gryffindor
"Warren, Myrtle",Ravenclaw
"Weasley, Fred",Gryffindor
"Weasley, George",Gryffindor
"Weasley, Ginny",Gryffindor
"Weasley, Percy",Gryffindor
"Weasley, Ron",Gryffindor
"Wood, Oliver",Gryffindor
"Zabini, Blaise",Slytherin

期望输出AFTER:

First,Last,House
Hannah,Abbott,Hufflepuff
Katie,Bell,Gryffindor
Susan,Bones,Hufflepuff
Terry,Boot,Ravenclaw
Lavender,Brown,Gryffindor
Millicent,Bulstrode,Slytherin
Cho,Chang,Ravenclaw
Penelope,Clearwater,Ravenclaw
Vincent,Crabbe,Slytherin
Colin,Creevey,Gryffindor
Dennis,Creevey,Gryffindor
Cedric,Diggory,Hufflepuff
Marietta,Edgecombe,Ravenclaw
Justin,Finch-Fletchley,Hufflepuff
Seamus,Finnigan,Gryffindor
Anthony,Goldstein,Ravenclaw
Gregory,Goyle,Slytherin
Hermione,Granger,Gryffindor
Angelina,Johnson,Gryffindor
Lee,Jordan,Gryffindor
Neville,Longbottom,Gryffindor
Luna,Lovegood,Ravenclaw
Remus,Lupin,Gryffindor
Draco,Malfoy,Slytherin
Scorpius,Malfoy,Slytherin
Ernie,Macmillan,Hufflepuff
Minerva,McGonagall,Gryffindor
Eloise,Midgen,Gryffindor
Cormac,McLaggen,Gryffindor
Graham,Montague,Slytherin
Theodore,Nott,Slytherin
Pansy,Parkinson,Slytherin
Padma,Patil,Gryffindor
Parvati,Patil,Gryffindor
Harry,Potter,Gryffindor
Tom,Riddle,Slytherin
Demelza,Robins,Gryffindor
Newt,Scamander,Hufflepuff
Horace,Slughorn,Slytherin
Zacharias,Smith,Hufflepuff
Severus,Snape,Slytherin
Alicia,Spinnet,Gryffindor
Pomona,Sprout,Hufflepuff
Dean,Thomas,Gryffindor
Romilda,Vane,Gryffindor
Myrtle,Warren,Ravenclaw
Fred,Weasley,Gryffindor
George,Weasley,Gryffindor
Ginny,Weasley,Gryffindor
Percy,Weasley,Gryffindor
Ron,Weasley,Gryffindor
Oliver,Wood,Gryffindor
Blaise,Zabini,Slytherin

问题分析与修复

你的代码存在两个核心问题:

  1. 循环逻辑错误:遍历输入文件时,你只是不断覆盖last和first变量,循环结束后仅保留最后一行的数据,随后才打开输出文件写入这一行,导致最终输出只有最后一条记录,而非全部数据。

  2. 文件打开模式错误:使用"a"(追加模式)打开输出文件,若文件已存在会在原有内容后追加,不符合作业生成全新输出文件的要求,应改用"w"(写入模式),确保每次运行生成干净的文件。

修正后的代码

import sys
import csv

def main():
    n, m = passing_arg()
    read_file(n, m)

def passing_arg():
    if len(sys.argv) > 3:
        sys.exit("Too many command-line arguments")

    elif len(sys.argv) < 3:
        sys.exit("Too few command-line arguments")

    elif not sys.argv[1].endswith(".csv") or not sys.argv[2].endswith(".csv"):
        sys.exit("Not a CSV file")

    return sys.argv[1], sys.argv[2]

def read_file(x, y):
    try:
        with open(x) as file:
            content = csv.DictReader(file)
            # 改用写入模式打开输出文件
            with open(y, "w") as f:
                fieldnames = ['First', 'Last', 'House']
                writer = csv.DictWriter(f, fieldnames=fieldnames)
                writer.writeheader()
                # 遍历每一行时直接处理并写入
                for row in content:
                    last, first = row["name"].split(", ")
                    writer.writerow({
                        'First': first,
                        'Last': last,
                        'House': row["house"]
                    })

    except FileNotFoundError:
        sys.exit(f"Could not read {x}")

if __name__ == "__main__":
    main()

关键修正点说明

  • 将输出文件的打开操作移至输入文件的上下文管理器内,同时把写入逻辑放到for row循环中,确保每一行数据都被处理并写入。
  • 将输出文件的打开模式从"a"改为"w",保证每次运行生成全新的输出文件。
  • 简化了passing_arg函数的返回逻辑,直接返回参数更简洁。
  • 移除了多余的add_header变量,因为writeheader()仅需调用一次,放在循环前即可完成表头写入。

内容的提问来源于stack exchange,提问作者PyProgrammer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 00:05:41