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
问题分析与修复
你的代码存在两个核心问题:
循环逻辑错误:遍历输入文件时,你只是不断覆盖
last和first变量,循环结束后仅保留最后一行的数据,随后才打开输出文件写入这一行,导致最终输出只有最后一条记录,而非全部数据。文件打开模式错误:使用
"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
相关产品推荐
相关产品推荐

