RuntimeError: input() already active - file loop

file-io, loops, python

Solution

The error is raised when you try to loop over a re-opened instance of the same file returned by `fileinput.input` while the previous instance returned by `fileinput.input` is still not exhausted or closed explicitly. So, multiple instances instances of `fileinput.input` cannot be used at the same time.

From `fileinput.input`:

The instance will be used as global state for the functions of this module, and is also returned to use during iteration.

import fileinput
finput = fileinput.input('abc1')
finput.next()
finput = fileinput.input('abc1')
finput.next()    

Output:

Traceback (most recent call last):
  File "so.py", line 5, in <module>
    finput = fileinput.input('abc1')
  File "/usr/lib/python2.7/fileinput.py", line 101, in input
    raise RuntimeError, "input() already active"
RuntimeError: input() already active

You can use `fileinput.FileInput` to use multiple instances at once. This code works fine:

import fileinput
finput = fileinput.FileInput('abc1')
finput.next()
finput = fileinput.FileInput('abc1')
finput.next()    

Note that as @Tim Pietzcker already pointed out in his answer, the for-loop over a `fileinput` instance already returns one line at a time(in your code the variable `line` is the actual line), so, the `.next` calls are not required there. And calling `.next` inside that loop might raise `StopIteration` error when the file object is exhausted.

import fileinput
finput = fileinput.input('abc1')
for line in finput:
    print line,           #current line returned by the for-loop
    print finput.next()  #Fetch the next line manually.

Problem

Read through the docs on fileinput but I'm making a basic error somewhere and I was hoping somebody could point out my mistake. Looping through a list in a file: ``` finput = fileinput.input('file.txt') for line in finput: // do something finput.next() else: finput.close() ``` On second loop it throws ``` raise RuntimeError, "input() already active" ``` Thought .next() was the right function to move to the second line

Original source