CS50 Scourgify作业:新生成CSV文件未被check50检测到
CS50 Scourgify作业check50退出码1问题修复
我在完成CS50 Python 2022的Scourgify作业时,代码生成的CSV文件格式符合要求,但check50报错::( scourgify.py creates new CSV file, expected exit code 0, not 1,明明文件已经生成,却无法通过检查。
我的代码如下:
import sys import csv def main(): if len(sys.argv) > 3: sys.exit("Too many command-line arguments") elif len(sys.argv) < 3: sys.exit("Too few command-line arguments") else: if sys.argv[1].endswith(".csv") and sys.argv[2].endswith(".csv"): before = sys.argv[1] after = sys.argv[2] write(before, after) else: sys.exit("Not CSV files") def get_students(docu): try: list = [] with open(docu, "r") as file: for line in file: newline = line.replace('"', '').strip() list.append(newline) newlist = [] for alumn in list: last, first, house = alumn.split(",") student = {"last": last, "first": first.strip(), "house": house} newlist.append(student) return newlist except: sys.exit(f"Could not read {docu}") def write(before, after): students = get_students(before) with open(after, "w", newline="") as csvfile: writer = csv.DictWriter(csvfile, fieldnames = ["first", "last", "house"]) writer.writeheader() for student in students: writer.writerow({"first": student["first"], "last": student["last"], "house": student["house"]}) if __name__ == "__main__": main()
问题分析
代码的核心错误出在get_students函数:
- 未处理表头行:原CSV第一行是表头
student,house,代码直接对该行执行split(",")得到两个元素,却试图解包给last, first, house三个变量,触发ValueError,进而触发except块的sys.exit,导致程序以非0码退出,这就是check50报错的直接原因。 - 手动解析CSV不规范:手动去掉引号再split的方式,无法正确处理CSV的格式逻辑(比如字段内包含逗号的场景),容易引发各种解析错误。
修复后的代码
import sys import csv def main(): if len(sys.argv) > 3: sys.exit("Too many command-line arguments") if len(sys.argv) < 3: sys.exit("Too few command-line arguments") if not (sys.argv[1].endswith(".csv") and sys.argv[2].endswith(".csv")): sys.exit("Not CSV files") input_file = sys.argv[1] output_file = sys.argv[2] write_students(input_file, output_file) def get_students(input_path): students = [] try: with open(input_path, "r") as file: reader = csv.DictReader(file) for row in reader: # 按原格式分割student字段为姓和名 last_name, first_name = row["student"].split(", ") students.append({ "first": first_name, "last": last_name, "house": row["house"] }) return students except FileNotFoundError: sys.exit(f"Could not read {input_path}") except ValueError: sys.exit("Invalid CSV format") def write_students(input_path, output_path): students = get_students(input_path) with open(output_path, "w", newline="") as file: writer = csv.DictWriter(file, fieldnames=["first", "last", "house"]) writer.writeheader() for student in students: writer.writerow(student) if __name__ == "__main__": main()
关键修复点
- 用
csv.DictReader读取CSV,自动处理表头和字段解析,避免手动处理引号、换行等细节问题。 - 明确按原字段格式
"Last, First"分割姓和名(分隔符为", "),确保解析准确。 - 拆分异常处理,区分文件不存在和格式错误的场景,避免捕获所有异常导致的调试困难。
- 简化main函数逻辑,去掉冗余的else分支,代码更简洁易读。
修复后程序会正常解析所有学生数据,生成符合要求的CSV文件,执行后退出码为0,可通过check50检查。
内容的提问来源于stack exchange,提问作者Anarres
相关产品推荐
相关产品推荐

