2017-09-25 164 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()'创建一个你不需要的新字符串,但它确实没关系。 –