CS50p作业6 Scourgify:scourgify.py未生成指定格式CSV求助
排查scourgify.py的check50格式错误问题
你的代码有两个关键问题导致check50判定格式错误:
1. 命令行参数判断逻辑完全颠倒
你当前的参数判断代码里,提示信息和条件完全不匹配:
if len(sys.argv) > 3: sys.exit("Too few command-line arguments") elif len(sys.argv) < 3: sys.exit("Too many command-line arguments")
- 当输入参数超过3个(比如4个),应该提示"Too many command-line arguments"
- 当输入参数不足3个(比如1个),应该提示"Too few command-line arguments"
修正后:
if len(sys.argv) < 3: sys.exit("Too few command-line arguments") elif len(sys.argv) > 3: sys.exit("Too many command-line arguments")
2. 姓名分割顺序颠倒且未限制分割次数
原before.csv的name列格式是「姓氏, 名字」(比如Potter, Harry),但你当前代码把分割后的第一个元素赋值给了first,第二个给了last,直接搞反了列内容。另外如果姓氏里包含逗号(比如Stark, Jr., Tony),无限制的split会导致解包失败。
修正方式:限制只分割第一次出现的逗号,同时修正赋值顺序:
last, first = row["name"].split(",", 1) first = first.strip() last = last.strip()
修正后的完整代码
import csv import sys def main(): # 检查命令行参数数量 if len(sys.argv) < 3: sys.exit("Too few command-line arguments") elif len(sys.argv) > 3: sys.exit("Too many command-line arguments") # 检查是否为csv文件 if not (sys.argv[1].endswith(".csv") and sys.argv[2].endswith(".csv")): sys.exit("Not a .csv file") # 读取输入文件并处理 try: with open(sys.argv[1], "r") as input_file, open(sys.argv[2], "w") as output_file: reader = csv.DictReader(input_file) writer = csv.DictWriter(output_file, fieldnames=["first", "last", "house"]) writer.writeheader() for row in reader: # 只分割第一个逗号,处理姓氏含逗号的情况,同时修正顺序 last_name, first_name = row["name"].split(",", 1) writer.writerow({ "first": first_name.strip(), "last": last_name.strip(), "house": row["house"] }) except FileNotFoundError: sys.exit(f"Could not read {sys.argv[1]}") if __name__ == "__main__": main()
内容的提问来源于stack exchange,提问作者Andy Zheng
相关产品推荐
相关产品推荐

