2017-10-05 629 views
2

當輸入量未知時,Python 3中讀取多行用戶輸入的最佳方式是什麼?多行輸入將通過回車Python3讀取未知多行輸入的最佳方式

當我嘗試使用

while True: 
    line = input() 
    if line: 
      print(line) 
    else: 
      break 

分離,收到的EOFError

然後,如果我其更改爲try-catch塊

while True: 
    line = input() 
    try: 
      print(line) 
    except EOFError: 
      break 

我仍然得到EOFError。

+2

這是合乎邏輯的,因爲打印時不會發生錯誤,但是在input()處。所以這應該在'try'中。 –

+0

你是從標準輸入管道輸入數據嗎?我從來沒有看到EOFError調用'input',但我想這是可能的。 –

+0

@AdamSmith:是的,如果你在大多數終端中使用Ctrl + D,這也可以看作是stdin的終結。 –

回答

4

EOFError發生在您致電input()時,而不是當您測試它時,或打印它時。因此,這意味着你應該try條款input()

try: 
    line = input() 
    print(line) 
except EOFError: 
    break

話雖這麼說,如果input從標準輸入通道讀取,你可以使用它作爲一個迭代:

import sys 

for line in sys.stdin: 
    print(line, end='') 

由於每line現在以新行字符'\n'結束,我們可以在print函數中使用end='',以防止打印新行兩次(一次來自字符串,一次來自print有趣ction)。

我認爲最後一個版本更優雅,因爲它幾乎在語法上表示您遍歷了stdin並單獨處理這些行。

+0

但是最後一行可能會導致問題,不是嗎?模仿'input()'確切可能是微妙的 – Elazar

+0

@Elazar:基於輸入的[documentation](https://docs.python.org/3/library/functions.html#input),它從stdin讀取,剝離新線,並返回。如果它有一個EOF字符,會引發一個'EOFError'。這與迭代器協議在stdin中的作用是一樣的(除了它在EOF的情況下終止循環,並且它不剝除新行)。 –

相關問題