我有几个文件(其中的数量是不确定的),我想同时读取,逐行或分块,做一些处理并移动到所有文件中的下一行(或块)。我想我的要求或多或少与这个问题中的要求相似。但是,在我的情况下,文件可以有不同的行数,并且在尝试实现诸如ExitStack 之类的东西时,注意到所有文件将在其中一个关闭后立即关闭(可能是行数最少的那个) ,而我想继续处理其他文件(最终将空字符串分配给关闭文件的“行”)。这是可以完成的事情吗?如何?
#cat f1.txt
RNvn 40
AvOp 13
yEVA 94
oNGn 10
VZQU 88
#cat f2.txt
gSNn 4
zxHP 84
ebRw 70
NaxL 2
lXUb 49
PQzn 79
aIyN 88
#cat f3.txt
XXce 5
RMIq 4
FFEi 47
wuLZ 60
Run Code Online (Sandbox Code Playgroud)
简单的实现ExitStack
,结果只有4行,因为filef3.txt
只有4行:
flist = ['f1.txt', 'f2.txt', 'f3.txt']
with ExitStack() as stack:
files = [stack.enter_context(open(fname)) for fname in flist]
for lines in zip(*files):
print(lines)
# prints
('RNvn 40\n', 'gSNn 4\n', 'XXce 5\n')
('AvOp 13\n', 'zxHP 84\n', 'RMIq 4\n')
('yEVA 94\n', 'ebRw 70\n', 'FFEi 47\n')
('oNGn 10\n', 'NaxL 2\n', 'wuLZ 60\n')
Run Code Online (Sandbox Code Playgroud)
您可以两全其美。
代码正在离开上下文,with ExitStack() as stack:
因为zip()
在最短的文件上用完了。它与ExitStack()
. zip_longest()
在所有文件完成之前,使用不会耗尽。然后ExitStack()
将关闭文件。
from contextlib import ExitStack
from itertools import zip_longest
flist = ['f1.txt', 'f2.txt', 'f3.txt']
with ExitStack() as stack:
files = [stack.enter_context(open(fname)) for fname in flist]
for lines in zip_longest(*files):
print(lines)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4208 次 |
最近记录: |