2

I have no idea how to fix this. I've tried retyping the program.

I get an unexpected indentation error for the last main function.

resident = 81
nonresident = 162


def main():

    # initialize counters and total tuition
    resident_counter = 0
    nonresident_counter = 0
    total_tuition = 0

    print("Name \tCode\tCredits\tTuition")
    print

    try:
        # open the data file
        infile = open('enroll.txt', 'r')

        # read the first value from the file
        student_name = infile.readline()

        # continue reading from file until the end
        while student_name != '':

            # strip the new line character and print the student's name
            student_name = student_name.rstrip('\n')
            print(student_name, end='\t')

            # read the code type, strip the new line, and print it
            code = infile.readline()
            code = code_type.rstrip('\n')
            print(code_type, end='\t')

            # read the number of credits, strip the new line, and print it
            credits = infile.readline()
            credits = int(credits)
            print(format(credits, '3.0f'), end='\t')

            # check the room type and compute the rental amount due 
            # increment the appropriate counter
            if code_type == "R" or room_type == "r":
                payment_due = credits * resident
                resident_counter += 1
            elif code_type == "N" or room_type == "n":
                payment_due = credits * nonresident
                nonresident_counter += 1
            elif code_type != "R" or code_type != "r" or code_type != "N" or code_type != "n":
                payment_due = 0

            # accumulate the total room rent
            tuition += payment_due

            # print the appropriate detail line
            if payment_due == 0:
                print('invalid code')
            else:
                print('$', format(tuition, '8,.2f'))

            # get the next studen't name
            student_name = infile.readline()

        # close the input file
        infile.close()

        # print the counters and payment total amount
        print
        print('total number of resident students: ', resident_counter)
        print('total number of nonresident: ', nonresident_counter)
        print
        print('total students: ', end='')
        print('$', format(tuition, ',.2f'))
# execute the main function

main()
4

7 回答 7

6

您没有excepttry.

于 2012-11-05T19:47:51.073 回答
5

尽管其他人都在说,如果你有一个try,你不必有一个except:你必须有一个except 或一个finally

这可能看起来很挑剔,但很可能您正在复制的代码实际上正在使用finally(例如,确保某些清理代码始终运行——假设它正在执行 C-/Java 样式的手动清理)。

无论如何,添加一个except从句不是正确的答案。如果您实际上希望处理或忽略错误,那么可以,添加一个except子句。如果您正在寻找某个地方添加即使出现错误也会运行的清理代码,请添加一个finally子句。如果您不想要,只需删除该try行。

于 2012-11-05T20:13:03.777 回答
2

您在 if else 语句中混合了房间类型和代码类型。您还缺少您的 except 声明。这应该是调用 main 之前的最后两行。

它应该是:

except IOError:
    print('an error occurred trying to open or read enroll.txt')
于 2012-11-06T01:09:40.847 回答
1

其他答案(正确地)指出您需要一个except与您一起使用的try:(或try完全不使用)。我将try解释将来如何调试类似的问题,因为这些调试起来可能非常烦人。

您的错误消息很可能看起来像这样:

  File "test.py", line 74
    main()
    ^
IndentationError: unexpected unindent

乍一看,这似乎没有太大帮助,而且肯定不是很清楚。

您“尝试重新键入程序”的事实听起来就像您看到IndentationError并想到的那样,“这意味着我的缩进搞砸了;也许某处有一个额外的空格,或者空格和制表符的混合体之类的。” 这些绝对是有效IndentationError的,如果你没有再次犯同样的输入错误,重新输入程序会修复它们。(附带说明,我相信任何值得使用的文本编辑器都可以选择将所有制表符转换为 4 个空格,以避免很多缩进问题。)

但是,查看错误文本,我们看到“意外取消缩进”。对我来说,这听起来有点像胡言乱语,但它的意思是,当 python 查看你的程序时,它遇到了一个它认为应该缩进更多的行。(不幸的是,这种错误可以称为“意外的未缩进”或“预期的缩进块”,它甚至可以显示为普通的旧的SyntaxError: invalid syntax。)

因此,知道错误消息的含义后,我们可以回顾一下代码,看看为什么 python 认为它main()的缩进很奇怪——尽管我们必须小心,因为 python 并不总是正确地了解问题的实际所在。这将是我的思考过程:

  • 在调用之前有一个函数定义main(),也许那个函数想main()在里面?不,不是这样,因为 python 只希望在函数定义之后至少有一行代码。
  • 还有什么“想要”代码在它之后缩进?if, elif,while都可以,但它们后面也都有代码。
  • 唯一的其他“压头”是try:. 在这一点上,您要么知道try: 需要跟 aexcept:或 afinally:并修复它,要么不知道。如果您不知道这一点,您仍然可以看到它try:后面跟着一个缩进块,并且,鉴于它可能是您错误的罪魁祸首,决定是时候查找是什么try:

好吧,我希望这有助于将来解决此类问题,并查看 abarnert 的答案和我的链接,以获取有关使用///语句处理错误的try更多信息exceptelsefinally

于 2012-11-05T20:43:05.450 回答
1

您正在使用 try 语句。这意味着你必须有一个 except 块

try:
    some code
except:
    pass

这是简化,但会解决您的问题。

于 2012-11-05T19:50:35.277 回答
0

除了缺少的exceptorfinally或额外的try……如果你看一下编辑后的代码,你可以看到缩进中奇怪的混合色块。这意味着您正在混合制表符和空格,这可能会导致不良缩进等问题。原因是解释器对如何解释制表符有不同的看法(例如 8 列与 4 列制表位)。

缩进时不能混用制表符和空格。我个人建议只使用空格。任何体面的编辑器都能够将 TAB 键扩展到空格和/或取消制表符和空格的现有混合。

于 2012-11-05T22:03:03.070 回答
0
  1. 正如上面 LevLevitsky 和 ​​david 所指出的,没有 except 子句。解决此问题的最简单方法是在调用 main 之前在代码中添加如下所示的行:

    except: pass
    
  2. 我对您的代码的第二条评论更具风格,但您可以在调用 main 之前和 except 子句之后添加以下内容:

    if __name__ == '__main__':
        main()
    
于 2012-11-05T19:53:40.570 回答