python同时读取多个文件

同时读取两个相同行的文件

spokenfile = open('xxx.txt','r',encoding='utf-8')
writtenfile = open('xxx.txt','r',encoding='utf-8')

for line1,line2 in zip(spokenfile,writtenfile):
    s1 = line1
    s2 = line2

Python3中的zip函数可以把两个或者两个以上的迭代器封装成生成器,这种zip生成器会从每个迭代器中获取该迭代器的下一个值,然后把这些值组装成元组(tuple)。这样,zip函数就实现了平行地遍历多个迭代器。
注意:
如果输入的迭代器长度不同,那么,只要有一个迭代器遍历完,zip就不再产生元组了,zip会提前终止,这可能导致意外的结果,不可不察。如果不能确定zip所封装的列表是否等长,可以改用 itertools 内置模块中的zip_longest 函数,这个函数不在乎它们的长度是否相等。
在Python2中,zip不是生成器,它平行地遍历这些迭代器,组装元组,并把这些元组所构成的列表一次性完整地返回,这可能会占用大量内存并导致程序崩溃,如果在Python2中要遍历数据量大的迭代器,推荐使用 itertools 内置模块中的 izip 函数。

同时读取多个文件

with读取文件比直接for循环更安全,隐式地执行了文件句柄的关闭。
with的作用,类似try…finally…,提供一种上下文机制,要应用with语句的类,其内部必须提供两个内置函数__enter__以及__exit__。前者在主体代码执行前执行,后则在主体代码执行后执行。

with open(filename1) as fp1, open(filename2) as fp2, open(filename3) as fp3:
    for l1 in fp1:
        l2 = fp2.readline()
        l3 = fp3.readline()
        # do something

稍微简介一点可以使用contextlib中的nested,有

from contextlib import nested
with nested(open(filename1), open(filename2), open(filename3)) as (fp1, fp2, fp3):
    for l1 in fp1:
        l2 = fp2.readline()
        l3 = fp3.readline()
        # do something

contextlib是为了加强with语句,提供上下文机制的模块,它是通过Generator实现的。
它提供了3个对象:装饰器 contextmanager、函数 nested 和上下文管理器 closing。使用这些对象,可以对已有的生成器函数或者对象进行包装,加入对上下文管理协议的支持,避免了专门编写上下文管理器来支持 with 语句。

nested 函数可以将多个上下文管理器组织在一起,避免使用嵌套 with 语句。

nested 语法

with nested(A(), B(), C()) as (X, Y, Z):
     # with-body code here

nested 执行过程

with A() as X:
    with B() as Y:
        with C() as Z:
             # with-body code here

需要注意的是,发生异常后,如果某个上下文管理器的 exit() 方法对异常处理返回 False,则更外层的上下文管理器不会监测到异常。

参考网址:
contextlib模块
python中关于with及contextlib的用法

  • 7
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值