【问题标题】:What does "input() already active" mean in python fileinput module?python fileinput模块中的“input()已经激活”是什么意思?
【发布时间】:2012-11-27 19:16:36
【问题描述】:

我正在尝试读取 text.txt 文件中的第二行:

import fileinput

x = 0
for line in fileinput.input([os.path.expandvars("$MYPATH/text.txt")]):
        if x < 3:
            x += 1
            if x == 2:
                mydate = line
fileinput.close()
print "mydate : ", mydate 

但我得到一个错误:

Traceback (most recent call last):
  File "/tmp/tmpT8RvF_.py", line 4, in <module>
    for line in fileinput.input([os.path.expandvars("$MYPATH/text.txt")]):
  File "/usr/lib64/python2.6/fileinput.py", line 102, in input
    raise RuntimeError, "input() already active"
RuntimeError: input() already active

上面有什么问题?

【问题讨论】:

    标签: python file input


    【解决方案1】:

    要从fileinput.input() 迭代中获取第二行,只需调用.next() 两次:

    finput = fileinput.input([os.path.expandvars("$MYPATH/text.txt")])
    finput.next()  # skip first line
    mydate = finput.next()  # store second line.
    

    您也可以使用itertools.islice() function 仅选择第二行:

    import itertools
    
    finput = fileinput.input([os.path.expandvars("$MYPATH/text.txt")])
    mydate = itertools.islice(finput.next(), 1, 2).next()  # store second line.
    

    这两种方法都确保从输入中读取的行不超过两行。

    .input() 函数返回一个全局单例对象,其他函数在该对象上进行操作。您一次只能运行一个 fileinput.input() 实例。确保在打开新的 input() 对象之前调用了 fileinput.close()

    您应该改用fileinput.FileInput() 类来创建多个实例。

    【讨论】:

    • 文件非常大,我只需要阅读第二行。您的上述建议是否适用于此?
    • 我尝试了第一种方法,但仍然出现“input() already active”错误。
    • @alwbtc:这两种方法只能读取到前两行(使用读取缓冲区)。这两种方法都不会读取整个文件。
    • 我尝试了 fileinput.FileInput() 而不是 fileinput.input() 并且成功了。
    • 好的,但是如果我使用您的第一种方法,使用 fileinput.input(),我只会创建一个实例。为什么我仍然收到“input() already active”错误?
    【解决方案2】:

    python的方式是:

    with open('text.txt', 'r') as file:
        file.next() #as Martjin stated in his response, skips 1st line
        mydate = file.next()
    

    在本例中,仅从文件中读取 2 行,并自动关闭。

    对于您的确切问题: 我的 python 是 Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41),它不会为您的示例引发该错误。该错误会出现,因为您在重新打开之前没有使用所有行输入。

    【讨论】:

    • 我不想消耗所有的行,文本文件真的很大。
    • 我说只从文件中读取前2行,处理总是最多2行,不管文件的长度
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 2010-09-29
    相关资源
    最近更新 更多