2017-09-25 162 views
2

打印下一行我想從Python中的文本文件,這是旁邊的海誓山盟在單獨一行打印兩行文字。因此,文本文件看起來像這樣:如何從文本文件蟒蛇

Apples 
Oranges 
Pears 
Lemons 

如果有人輸入蘋果,我想程序打印出:

Apples 
Oranges 

這裏是我的代碼至今:

file = open('Fruit.txt',"r") 
for line in file: 
    if InputText in line: 
     print(line) 
     print(line+1) 
     return 
file.close() 

過程變量line+1是不正確的,但我已經離開那裏,說明該文本的下一行,還必須印。

+0

如果你的代碼出現在一個函數,你應該在你的例子你給說清楚。否則,「返回」是非法的。 –

回答

2

如果您的訂單相匹配,你可以打電話next(input)產生以下行。 此外,如果你使用with上下文管理器,您刪除需要關閉該文件,這將清理代碼有點

InputText = 'Pears' 

with open('Fruit.txt', "r") as input: 
    for line in input: 
     if InputText in line: 
      print(line, end='') 
      print(next(input), end='') 
      break 

>> Pears 
>> Lemons 

或與您的原始解決方案:

InputText = 'Apples' 

infile = open('Fruit.txt',"r") 
for line in infile: 
    if InputText in line: 
     print(line, end='') 
     print(next(infile), end='') 
     return 
infile.close() 

>> Apples 
>> Oranges 
+1

更強大的方法是'下一個(輸入)'。 –

+0

當我使用你的建議時,我得到的錯誤:TypeError:'builtin_function_or_method'對象不是迭代器 –

+0

@RipseedOil將你命名'file'的變量重命名爲'infile',並確保你調用'next(infile) - 查看更新 – AK47

4

有有幾件事你應該考慮改變你的代碼以使它正常工作。從頂部開始:

  1. 考慮使用文件你作爲一個with語句context manager開放。引述explanation in the docs:你迭代的是一個迭代

    It is good practice to use the with keyword when dealing with file objects. The advantage is that the file is properly closed after its suite finishes, even if an exception is raised at some point. Using with is also much shorter than writing equivalent try-finally blocks.

  2. 文件對象(who'da咚吧?)。這意味着你可以使用內建的next函數。即使你沒有跳出循環,因爲文件對象所做的惰性迭代,這也是可行的。在一般情況下,除非你真的知道你在做什麼,叫上一個for循環中的迭代器next可能會導致非常意外的結果。

  3. 每一行(除了可能的最後一個)將包含一個尾隨\n字符。 print通常將另一個換行符附加到它打印的字符串。爲避免雙換行符,您可以將end=''添加到print的參數中。 end是一個僅用於關鍵字的參數,用於確定print附加到其輸出的行結尾。

  4. 您需要說明當用戶在文件的最後一行輸入單詞時想要發生的情況:在您的示例中爲'Lemons'。目前,使用next將引發一個StopIteration錯誤。您可以捕捉錯誤,對其進行轉換,或者在文件的末尾添加一個空白行以確保不會發生。

  5. 在模塊級循環中使用return是非法的。如果您的代碼不在函數或方法中,則應使用break退出循環而不是return

這裏是一個看起來什麼都喜歡的組合:

 
with open('Fruit.txt',"r") as file: 
    for line in file: 
     if InputText in line: 
      print(line, end='') 
      print(next(file), end='') 
      break 
+0

非常深入的答案!不會調用'line.strip()'比'end ='''更乾淨? –

+0

@JoeIddon。這真的取決於你想要做什麼。 –

+0

@Joelddon:'line.strip()'創建一個你不需要的新字符串,但它確實沒關係。 –