房子pset7对我来说很好用,但在通过check50运行时不起作用

时间:2020-10-02 09:22:32

标签: sql python-3.x sqlite cs50

我正在使用的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年

1 个答案:

答案 0 :(得分:0)

根据规格:

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

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

  • 您可以假定CSV文件将存在,并且将具有名称,房屋和出生栏。

CSV文件的名称不应 进行硬编码,因为此处为if argv[1] != "characters.csv":

但是等等! (问题编辑后)

这个if 'middle' != None:总是正确的!为什么?因为'middle'是字符串文字。也许您是说row['middle']