2012-11-05 71 views
3

我不知道如何解決這個問題。我試過重新輸入程序。Python意外indentaton錯誤主要()

我得到一個意想不到的縮進錯誤的最後一個主要功能。

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() 
+3

作爲一個方面說明:'寫作本身print'不會在Python 3打印一個空行,它會只是仰望的'print'函數的值並沒有採取任何措施。你可能需要'print()'。此外,您可能希望將open('enroll.txt','r')作爲infile'而不是進行手動'close'調用;如果你剛剛學習如何「嘗試」的工作,你只是想要嘗試手動清理的麻煩。 – abarnert

+0

PS,你從哪裏複製代碼?如果我們知道你想要做什麼,我們可以更好地猜測如何去做...... – abarnert

+0

最後一件事:圍繞'readline(f)'的顯式循環通常值得用'for line in f:'替代。它更容易閱讀,它消除了fencepost錯誤的可能性等等。在你的情況下,你處理的是三行的批次,而不是逐行,這使得這更復雜 - 但你可以做'for(student,代碼,學分)在石斑魚(3,infile):'(參見http://stackoverflow.com/questions/1624883/alternative-way-to-split-a-list-into-groups-of-n for'grouper' )。 – abarnert

回答

6

你沒有一個except條款相匹配的try

1

您正在使用try語句。這意味着你必須有一個除外塊

try: 
    some code 
except: 
    pass 

這是簡化,但會解決你的問題。

+1

正如我在另一個回答中所說:「'except:pass'基本上意味着,如果'try:'代碼塊中的任何地方出現問題,您什麼也不做,而不是處理錯誤。使用'except:pass',特別是作爲「修復」縮進問題。「 –

+0

當然,但要解釋一個新的python傢伙,可以使用它(恕我直言)。 – alexvassel

0
  1. 正如LevLevitsky和David所述,沒有除外條款。要解決這個問題最簡單的方法是添加類似下面的代碼中調用之前主要線路:

    except: pass 
    
  2. 你的代碼的第二個評論我是比較風格,但你可以添加以下,前您的通話主後except子句:

    if __name__ == '__main__': 
        main() 
    
+1

'except:pass'基本上意味着如果在'try:'代碼塊中的任何地方出現問題,您什麼都不做,而不是處理錯誤。您通常不想使用'except:pass',特別是作爲縮進問題的「修復」。 –

+0

@MatthewAdams這是「解決這個問題的最簡單方法」,不是最好的,也不是推薦的方式。 – hd1

+0

沒錯,但是我想讓任何閱讀此文的新用戶都明白這一點。 –

4

儘管所有人都在說,如果你有一個try,你不必有一個except:你必須有一個except或一個finally

這可能看起來很挑剔,但您要複製的代碼實際上是使用finally(例如,爲了確保某些清理代碼始終運行 - 假定它正在執行C/Java風格的手動清理),這似乎很合理。

無論如何,添加except子句並不是正確答案。如果你真的想要處理或忽略錯誤,那麼是的,添加一個except子句。如果您正在尋找某處添加即使出現錯誤也會運行的清理代碼,請添加finally子句。如果你不想要,只需刪除try行。

+0

+1這個答案解釋了它 –

1

其他答案已經(正確地)指出你需要有一個except去與你的try:(或完全不使用try)。我要去try來解釋你將來如何去調試類似的問題,因爲這些可能會非常惱人的調試。

你的錯誤消息,很可能是看起來是這樣的:

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

乍一看,這似乎並沒有太大的幫助,而且這絕對不是很清楚。

事實上,你「嘗試重新輸入程序」聽起來像你看到IndentationError,並認爲,「這意味着我的縮進被搞砸了;也許有一個額外的空間或空間和標籤或什麼的混合物。這些肯定是有效的IndentationError s,重新鍵入該程序將修復它們,如果你沒有再犯同樣的打字錯誤。(在附註中,我相信任何值得使用的文本編輯器都可以選擇將所有制表符轉換爲4個空格以避免大量縮進問題。)

但是,看看錯誤文本,我們看到「意外的無名」。對我來說,這聽起來有點像胡言亂語,但它意味着,當python看着你的程序時,它碰到了一條它認爲應該縮進的行。 (不幸的是,這種相同類型的錯誤可以稱爲「意外unindent」或「預期的縮進塊」,它甚至可以顯示爲普通的舊SyntaxError: invalid syntax。)

因此,瞭解錯誤消息的含義,我們可以通過代碼回顧一下,看看爲什麼python認爲main()是奇怪的縮進 - 儘管我們必須小心,因爲python並不總是正確的問題的實際位置。這裏會像我的思維過程:

  • main()前一個函數的定義右邊的叫,也許是功能要main()在裏面呢?不,那不是,因爲python只在函數定義之後真正需要至少一行代碼。
  • 還有什麼「想要」的代碼在它後面縮進? ifelifwhile都可以,但他們都有代碼。
  • 唯一的其他「壓頭」是try:。在這一點上,你要麼知道try:needs to be followed by a except: or a finally:,你解決它,或者你不知道。如果您不知道,那麼您仍然可以看到try:後面跟着一個縮進塊,並且,鑑於它可能是您錯誤的罪魁禍首,請決定是時候查看try:的功能。

嗯,我希望在未來,幫助像這樣的疑難問題,並檢查了abarnert的回答和我的try/except/else/finally報表鏈接以獲得更多關於處理錯誤。

0

除了缺少exceptfinally或額外try ......如果你看看edited code,你可以看到在壓痕奇怪的混合色塊。這意味着您正在混合製表符和空格,這可能導致壞縮進等問題。原因是解釋者對標籤應該如何解釋有不同的看法(例如8列與4列製表符停止)。

不能混合縮進的製表符和空格。我個人會建議只使用空格。任何體面的編輯器都可以將TAB鍵擴展到空格和/或消除現有的標籤和空格混合。

2

您在if else語句中混合了房間類型和代碼類型。你也錯過了你的除外聲明。這應該是你調用main之前的最後兩行。

它應該閱讀:

except IOError: 
    print('an error occurred trying to open or read enroll.txt') 
+0

我很感激幫助。縮進錯誤是固定的。我會盡我所能完成剩下的程序。 –