在 iter 上调用 next,有选择地在任何文件句柄上调用?

Call next on iter, selectively on any file handle?

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

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

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

() missing 1 required positional argument: 'filehandle'

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

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

如果我不为 lambda 保留任何参数,它会为所有文件句柄采用循环中的最后一个文件句柄。

有人可以帮助解决如何对所有打开的文件创建 iter 并有选择地调用 next 吗?

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

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

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

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