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

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函数:

  1. 未处理表头行:原CSV第一行是表头student,house,代码直接对该行执行split(",")得到两个元素,却试图解包给last, first, house三个变量,触发ValueError,进而触发except块的sys.exit,导致程序以非0码退出,这就是check50报错的直接原因。
  2. 手动解析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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 04:50:23