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")
问题根源
- 姓名顺序完全颠倒:输入CSV的
name字段格式是Last, First(比如Potter, Harry),代码拆分后把姓氏赋值给first、名字赋值给last,完全搞反了字段对应关系,这是检测失败的核心原因。 - 拆分逻辑不严谨:直接用
split(",")会在姓名包含逗号时(比如van der Sar, Edwin)拆分出多个元素,引发ValueError,应该限制只按第一个逗号拆分。 - 表头写法不规范:手动写入表头虽然内容正确,但
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
相关产品推荐
相关产品推荐

