python-3.x - 如何在Python中同时打开多个文件?

标签 python-3.x file

我有几个文件(其数量未先确定),我想同时逐行或分块读取这些文件,进行一些处理并移至所有文件中的下一行(或 block ) 。我想我的要求或多或少类似于this question中的要求。但是,就我而言,文件可以具有不同的行数,并且在尝试实现类似 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

通过简单实现 ExitStack,结果仅包含 4 行,因为文件 f3.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')

最佳答案

您可以两全其美。

代码正在离开上下文 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)

关于python-3.x - 如何在Python中同时打开多个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56247247/

相关文章:

python - 将框架中的所有条目小部件绑定(bind)到一个键

python - 我想将年龄列中的每个值替换为其中间值

visual-studio - 这些 WCF 服务引用文件是什么

linux - 查找已设置 UID 位的所有文件

c - C 中的文件冗余

c++ - VC++ 2012 无法读取大于 4 GB 的文件

java - AES key 对生成器无法识别

python-3.x - 如何删除并仅保留某些非字母数字字符?

linux - 找不到 webdriver.xpi - Python3,Linux Mint

python - 在不复制变量的情况下重用 %s 占位符?