【问题标题】:houses pset7 works fine with me but doesn't work when run through check50房子 pset7 对我很好,但在运行 check50 时不起作用
【发布时间】:2020-10-02 09:22:32
【问题描述】:

我正在处理的 pset 有 2 个部分,这两个部分都适用于我。但是,当我通过 check50 运行这些时,我会得到 1/6。这是我应该在 pset 中执行的操作的链接:pset,这些是我得到的错误:errors

这是我的 import.py 代码:

from cs50 import SQL
from sys import argv, exit
import csv

db = SQL("sqlite:///students.db")

if len(argv) != 2:
    print("error")
    exit(1)
    
if argv[1] != "characters.csv":
    print("error")
    exit(1)
    
with open(argv[1], "r") as CSVfile:
    CSVfile = csv.DictReader(CSVfile, delimiter = ',')
    chars = list(CSVfile)
    
    for row in chars:
        name = row["name"]
        birth = row["birth"]
        house = row["house"]
        
        full = name.split( )
        
        if len(full) == 2:
            
            first = full[0]
            last = full[1]
            
            db.execute("INSERT INTO students(first, last, house, birth) VALUES(?, ?, ?, ?)", first, last, house, birth)
            
        elif len(full) == 3:
            
            first = full[0]
            middle = full[1]
            last = full[2]
            
            db.execute("INSERT INTO students(first, middle, last, house, birth) VALUES(?, ?, ?, ?, ?)", first, middle, last, house, birth)

这是我的花名册代码:

from cs50 import SQL
from sys import argv, exit
import csv

if len(argv) != 2:
    print("error")
    exit(1)
    
db = SQL("sqlite:///students.db")

results = db.execute("SELECT * FROM students WHERE house = ? ORDER BY last ASC, first ASC", argv[1])


for row in results:
    
    if 'middle' != None:
        print(f"{row['first']} {row['middle']} {row['last']}, born {row['birth']}")
    
    else:
        print(f"{row['first']} {row['last']}, born {row['birth']}")

我已经和一位导师谈过了,我已经纠正了他提到的错误,所以它们是无关紧要的。提前致谢。

编辑:

我删除了这部分:

if argv[1] != "characters.csv":
        print("error")
        exit(1)

因为将 csv 文件的名称硬编码到我的代码中是错误的。这改善了很多。但是,我现在在名册上遇到了问题。我的意思是输出是学生的全名和出生年份。有些学生没有中间名,所以我尝试做一个 if 条件来查看这个名字中是否存在“中间”:

if 'middle' != None:
            print(f"{row['first']} {row['middle']} {row['last']}, born {row['birth']}")
        
        else:
            print(f"{row['first']} {row['last']}, born {row['birth']}")

但是,对于没有中间名的学生,我会得到这样的输入:Lavender None Brown,1979 年出生

【问题讨论】:

    标签: sql python-3.x sqlite cs50


    【解决方案1】:

    来自规范:

    • 您的程序应该接受 CSV 文件的名称作为命令行参数。

    • 如果提供的命令行参数数量不正确,您的程序应该打印错误并退出。

    • 您可以假设 CSV 文件将存在,并且将包含名称、房屋和出生列。

    CSV 文件的名称​​不应该是硬编码的,因为这里是if argv[1] != "characters.csv":

    但是等等还有更多! (问题编辑后)

    这个if 'middle' != None:永远是真的!为什么?因为'middle' 是字符串文字。也许你的意思是row['middle']

    【讨论】:

    • 谢谢!这使得 import.py 中的所有内容都正确。但是我现在在名册中得到了不寻常的输出。我编辑了我的问题,所以你可以看到它
    • 信息添加到答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 2022-12-06
    • 2014-11-22
    • 1970-01-01
    • 2021-01-09
    相关资源
    最近更新 更多