【问题标题】:Call next on iter, selectively on any file handle?在 iter 上调用 next,有选择地在任何文件句柄上调用?
【发布时间】:2021-03-04 22:37:32
【问题描述】:

我在路径中有文件列表,我想在其中创建 iter 对象,因此我可以随时从任何文件中读取,同时所有文件都处于打开状态。路径中的文件数量是动态的。

filehandles = []
for filename in glob.glob(path):
    filehandles += [open(filename, 'r')]
print(filehandles)

下面的代码在调用 next() 时抛出编译错误

() 缺少 1 个必需的位置参数:'filehandle'

for filehandle in filehandles:
    fileiters += [iter(lambda filehandle: filehandle.readline(), '')]

print(next(fileiters[2])(filehandles[3]))

如果我没有为 lambda 保留任何参数,它将为所有文件句柄获取循环中的最后一个文件句柄。

有人可以帮助如何在所有打开的文件上创建迭代并有选择地调用下一个吗?

【问题讨论】:

    标签: python iterator lazy-loading file-handling


    【解决方案1】:

    文件对象已经是迭代器。我不确定我是否理解您在示例代码末尾尝试print 的内容,但您应该已经可以执行print(next(filehandles[3]))(打印列表中第四个文件中的下一行)。

    虽然这里可能没有必要,但如果您需要解决将来在循环中创建 lambda 函数的一般问题,一般的方法是为参数添加一个默认值:

    functions = []
    for x in lst:
        functions.append(lambda x=x: x.foo())
    

    默认参数急切地绑定到函数对象,因此它保留了 x 在计算 lambda 表达式时的值。

    【讨论】:

    • 这 2 行已解决 => myiter = iter(lambda: lambda filehandle: filehandle.readline(), '') TopItemsFromEachFile = [next(myiter)(filehandles[i]) for i in range( len(文件句柄))]
    • 那个迭代器和高阶函数对我来说似乎完全没用。我很确定它相当于[fh.readline() for fh in filehandles]。您很少需要在 Python 中编写自己的迭代器,而且几乎从不需要用于读取文件,因为它们已经是它们自己的迭代器了。
    猜你喜欢
    • 2017-05-25
    • 1970-01-01
    • 2010-10-20
    • 2019-07-19
    • 2018-02-26
    • 2014-06-13
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    相关资源
    最近更新 更多