无法通过 scourgify 问题集 6 的 CS50 检查

问题描述 投票:0回答:3

我无法通过测试,尽管我的代码运行良好当我检查时,

下面是我的代码..

import sys
import csv

def main():
    n, m = passing_arg()
    read_file(n, m)

def passing_arg():
    if len(sys.argv) > 3:
        sys.exit("Too many command-line arguments")

    elif len(sys.argv) < 3:
        sys.exit("Too few command-line arguments")

    elif sys.argv[1].endswith(".csv") == False or sys.argv[2].endswith(".csv") == False:
        sys.exit("Not a CSV file")

    else:
        x = sys.argv[1]
        y = sys.argv[2]
        return x, y

def read_file(x, y):
    try:
        with open(x) as file:
            content = csv.DictReader(file)
            print(type(content))
            add_header = True
            for row in content:
                last, first = row["name"].split(", ")

            with open(y, "a") as f:
                fieldnames = ['First', 'Last', 'House']
                content1 = csv.DictWriter(f, fieldnames=fieldnames)
                if add_header:
                    content1.writeheader()
                    add_header = False
                 content1.writerow({fieldnames[0] : first, fieldnames[1] : last, fieldnames[2] : row["house"]})


    except FileNotFoundError:
        sys.exit(f"Could not read {x}")


if __name__ == "__main__":
    main()

我也没有忽略空格。 这是我的代码失败的地方:link

之前:

name,house
"Abbott, Hannah",Hufflepuff
"Bell, Katie",Gryffindor
"Bones, Susan",Hufflepuff
"Boot, Terry",Ravenclaw
"Brown, Lavender",Gryffindor
"Bulstrode, Millicent",Slytherin
"Chang, Cho",Ravenclaw
"Clearwater, Penelope",Ravenclaw
"Crabbe, Vincent",Slytherin
"Creevey, Colin",Gryffindor
"Creevey, Dennis",Gryffindor
"Diggory, Cedric",Hufflepuff
"Edgecombe, Marietta",Ravenclaw
"Finch-Fletchley, Justin",Hufflepuff
"Finnigan, Seamus",Gryffindor
"Goldstein, Anthony",Ravenclaw
"Goyle, Gregory",Slytherin
"Granger, Hermione",Gryffindor
"Johnson, Angelina",Gryffindor
"Jordan, Lee",Gryffindor
"Longbottom, Neville",Gryffindor
"Lovegood, Luna",Ravenclaw
"Lupin, Remus",Gryffindor
"Malfoy, Draco",Slytherin
"Malfoy, Scorpius",Slytherin
"Macmillan, Ernie",Hufflepuff
"McGonagall, Minerva",Gryffindor
"Midgen, Eloise",Gryffindor
"McLaggen, Cormac",Gryffindor
"Montague, Graham",Slytherin
"Nott, Theodore",Slytherin
"Parkinson, Pansy",Slytherin
"Patil, Padma",Gryffindor
"Patil, Parvati",Gryffindor
"Potter, Harry",Gryffindor
"Riddle, Tom",Slytherin
"Robins, Demelza",Gryffindor
"Scamander, Newt",Hufflepuff
"Slughorn, Horace",Slytherin
"Smith, Zacharias",Hufflepuff
"Snape, Severus",Slytherin
"Spinnet, Alicia",Gryffindor
"Sprout, Pomona",Hufflepuff
"Thomas, Dean",Gryffindor
"Vane, Romilda",Gryffindor
"Warren, Myrtle",Ravenclaw
"Weasley, Fred",Gryffindor
"Weasley, George",Gryffindor
"Weasley, Ginny",Gryffindor
"Weasley, Percy",Gryffindor
"Weasley, Ron",Gryffindor
"Wood, Oliver",Gryffindor
"Zabini, Blaise",Slytherin

之后:

First,Last,House
Hannah,Abbott,Hufflepuff
Katie,Bell,Gryffindor
Susan,Bones,Hufflepuff
Terry,Boot,Ravenclaw
Lavender,Brown,Gryffindor
Millicent,Bulstrode,Slytherin
Cho,Chang,Ravenclaw
Penelope,Clearwater,Ravenclaw
Vincent,Crabbe,Slytherin
Colin,Creevey,Gryffindor
Dennis,Creevey,Gryffindor
Cedric,Diggory,Hufflepuff
Marietta,Edgecombe,Ravenclaw
Justin,Finch-Fletchley,Hufflepuff
Seamus,Finnigan,Gryffindor
Anthony,Goldstein,Ravenclaw
Gregory,Goyle,Slytherin
Hermione,Granger,Gryffindor
Angelina,Johnson,Gryffindor
Lee,Jordan,Gryffindor
Neville,Longbottom,Gryffindor
Luna,Lovegood,Ravenclaw
Remus,Lupin,Gryffindor
Draco,Malfoy,Slytherin
Scorpius,Malfoy,Slytherin
Ernie,Macmillan,Hufflepuff
Minerva,McGonagall,Gryffindor
Eloise,Midgen,Gryffindor
Cormac,McLaggen,Gryffindor
Graham,Montague,Slytherin
Theodore,Nott,Slytherin
Pansy,Parkinson,Slytherin
Padma,Patil,Gryffindor
Parvati,Patil,Gryffindor
Harry,Potter,Gryffindor
Tom,Riddle,Slytherin
Demelza,Robins,Gryffindor
Newt,Scamander,Hufflepuff
Horace,Slughorn,Slytherin
Zacharias,Smith,Hufflepuff
Severus,Snape,Slytherin
Alicia,Spinnet,Gryffindor
Pomona,Sprout,Hufflepuff
Dean,Thomas,Gryffindor
Romilda,Vane,Gryffindor
Myrtle,Warren,Ravenclaw
Fred,Weasley,Gryffindor
George,Weasley,Gryffindor
Ginny,Weasley,Gryffindor
Percy,Weasley,Gryffindor
Ron,Weasley,Gryffindor
Oliver,Wood,Gryffindor
Blaise,Zabini,Slytherin

我甚至注意到 before.csv 中用逗号分隔的名称之间的空格。但还是无法通过测试。

python python-3.x csv cs50
3个回答
1
投票

您发布的代码中有 3 个错误。根据您的“完美运行”评论,我认为当您将代码复制到问题中时,第一个可能是格式错误。需要解决其他 2 个错误才能使您的代码通过。 (仅供参考,当我修复所有 3 个错误时,check50 通过了。)错误是:

  1. 打开文件和写入时缩进不正确
  2. 标题行不正确(大小写错误)
  3. 打开写入文件时错误使用文件模式“a”

下面提供了每项的详细解释。

1。缩进不正确(参见第 32-38 行)。 @Zach Young 的答案显示了您的缩进错误(如发布的)。打开“之前”文件,读取所有行,然后打开“之后”文件,只写入 2 行(标题和最后一行)。

for row in content:
    last, first = row["name"].split(", ")

    with open(y, "a") as f:
        fieldnames = ['First', 'Last', 'House']
        content1 = csv.DictWriter(f, fieldnames=fieldnames)
        if add_header:
            content1.writeheader()
            add_header = False
            content1.writerow({fieldnames[0] : first, fieldnames[1] : last, fieldnames[2] : row["house"]})

2。标题行案例。 这个很简单。阅读说明进行确认。

fieldnames = ['First', 'Last', 'House']
should be:
fieldnames = ['first', 'last', 'house']

3.错误地使用文件模式“a”。 这是一个微妙的错误。如果您只运行程序一次,您将不会检测到错误。使用相同的命令行文件名运行它两次,“之后”文件的长度将是原来的两倍。发生这种情况是因为追加模式不断添加到现有文件。
有多种方法可以解决这个问题。您可以使用像

add_header
这样的文件模式变量,也可以根据
open()
的值使用不同的
add_header
行。然而,解决这个问题最干净/最简单的方法是切换内部和外部循环。目前,您在“之前”文件上循环,然后必须在读取每一行后打开并写入“之后”文件。反转它们:首先打开“after”文件(一次),然后打开“before”文件以读取“before”中的行并写入“after”。这些方法中的任何一种都会起作用。关键是当您多次运行该程序时,不要将行追加到现有文件中。

正如我上面提到的,我修复了所有 3 个错误,运行了 check50 并且它通过了所有测试。顺便说一句,当测试表明你有错误时,你就有错误了。换句话说,代码不能“完美运行”。开发人员有责任找到并修复它们。这需要勤奋的诊断和谦逊。祝你好运。


0
投票

我用 before.csv 运行了你的代码,并在 after.csv 中得到了这个:

First,Last,House
Blaise,Zabini,Slytherin

不过,我不确定这是否是自动检查器不满意的地方:

:( scourgify.py 清理短 CSV 文件

原因 scourgify.py 不会生成指定格式的 CSV 日志

running python3 scourgify.py before.csv after.csv...
checking that program exited with status 0...
checking that after.csv exists...

回到我在 CSV 中只得到一行输出的问题,可能是您的代码复制粘贴引入了缩进错误,该错误改变了程序的含义,并且只有一行写入输出 CSV。如果您回顾您发布的代码并且缩进符合您的预期,那么您需要重新考虑如何读取、处理和写入行。

对于我自己日常使用 Python csv 模块,我喜欢将所有行读入一个列表,然后处理这些行,然后将它们写出来。像这样的东西:

all_rows = []
with open("before.csv", newline="") as f:
    reader = csv.DictReader(f)
    all_rows = list(reader)

processed_rows = []
for row in all_rows:
    pass  # Do something with row and build up processed_rows


with open("after.csv", "w", newline="") as f:
    writer = csv.DictWriter(f, fieldnames=processed_rows[0])
    writer.writeheader()
    writer.writerows(processed_rows)

附加到 CSV 可能会变得混乱,因此我尝试通过在写入之前确保所有行都已准备好来避免这种情况。

祝你好运! :)


0
投票

根据python官方文档

如果未指定 newline='',则嵌入在带引号的字段中的换行符将无法正确解释,并且在使用 写一个额外的衬里 将会添加。

因为 csv 模块执行自己的(通用)换行符处理。 因此,使用

newlines=""
模块打开和关闭文件时无需指定
csv

更好地处理和调整csv模块的方言。 CSV Writer 的

lineterminator
默认为“ ” 因此,相应地调整您的代码,
lineterminator="\r"
将使您的代码通过测试。

def write_to(new_dict, filename):
    with open(filename, "w") as after:
        writer = csv.DictWriter(
            after, fieldnames=["first", "last", "house"], lineterminator="\r"
        )
        writer.writeheader()
        writer.writerows(new_dict)
© www.soinside.com 2019 - 2024. All rights reserved.