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

CS50 PSet6 Scourgify代码未通过最后两个check50检测求助

CS50 Python 2022 Problem Set 6: Scourgify 检测失败问题排查

我的代码通过了check50大部分检测,但卡在最后两项:scourgify.py cleans short csv file和scourgify.py cleans long csv file,尝试用lstrip()处理无效,代码如下:

import sys
import csv

# check for two command-line arguments
if len(sys.argv) == 3:
    try:
    # creat a buffer csv file
        buffer = []
        #open input file for reading
        with open(sys.argv[1]) as file_input:
            # read input file
            reader = csv.reader(file_input)
            for row in reader:
                # append each line into a csv buffer
                buffer.append(row)

        # open output file for writing
        with open(sys.argv[2], "w") as file_output:
            writer = csv.DictWriter(file_output, fieldnames= ["first", "last", "house"])
            writer.writerow({"first": "first", "last": "last", "house": "house"})
            #ignore the first row of csv buffer
            for line in buffer[1:]:
                first, last = line[0].split(",")
                writer.writerow({"first": first, "last": last.lstrip(), "house": line[1]})

    except OSError:
        sys.exit(f"Couldn't read {sys.argv[1]}")

# check for fewer command-line arguments
elif len(sys.argv) < 3:
    sys.exit("Too few comman-line arguments")

# check for more command-line argument
else:
    sys.exit("Too many command-line arguments")

问题根源

  1. 姓名顺序完全颠倒:输入CSV的name字段格式是Last, First(比如Potter, Harry),代码拆分后把姓氏赋值给first、名字赋值给last,完全搞反了字段对应关系,这是检测失败的核心原因。
  2. 拆分逻辑不严谨:直接用split(",")会在姓名包含逗号时(比如van der Sar, Edwin)拆分出多个元素,引发ValueError,应该限制只按第一个逗号拆分。
  3. 表头写法不规范:手动写入表头虽然内容正确,但DictWriter内置的writeheader()方法能保证格式完全符合CSV标准,避免潜在的换行或引号差异。

修正后的代码

import sys
import csv

if len(sys.argv) != 3:
    sys.exit("Too few or too many command-line arguments")

try:
    with open(sys.argv[1]) as file_input:
        reader = csv.reader(file_input)
        next(reader)  # 直接跳过表头,无需缓存整个文件
        with open(sys.argv[2], "w") as file_output:
            writer = csv.DictWriter(file_output, fieldnames=["first", "last", "house"])
            writer.writeheader()  # 用内置方法生成标准表头
            for row in reader:
                # 按第一个逗号拆分,兼容含逗号的姓名
                last_name, first_name = row[0].split(",", 1)
                writer.writerow({
                    "first": first_name.strip(),
                    "last": last_name.strip(),
                    "house": row[1]
                })
except OSError:
    sys.exit(f"Couldn't read {sys.argv[1]}")

关键修改点

  • 纠正姓名拆分后的赋值顺序,将Last, First正确映射到last和first字段
  • 使用split(",", 1)限制拆分次数,避免姓名含逗号时出错
  • 用writer.writeheader()替代手动写表头,保证格式完全符合要求
  • 去掉不必要的缓存列表,逐行处理节省内存
  • 用strip()处理姓名前后所有空白字符,比lstrip()更全面

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 13:31:00