在 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 表达式时的值。
我在路径中有文件列表,我想为其创建 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 表达式时的值。