python合并文件 merge_python – 合并预先排序的文件而不将所有内...

如果标准库中有heapq.merge(),为什么要自己滚动?不幸的是,它没有提供一个关键的论点 – 你必须做装饰 – 合并 – 不自然的舞蹈你自己:

from itertools import imap

from operator import itemgetter

import heapq

def extract_timestamp(line):

"""Extract timestamp and convert to a form that gives the

expected result in a comparison

"""

return line.split()[1] # for example

with open("log1.txt") as f1, open("log2.txt") as f2:

sources = [f1, f2]

with open("merged.txt", "w") as dest:

decorated = [

((extract_timestamp(line), line) for line in f)

for f in sources]

merged = heapq.merge(*decorated)

undecorated = imap(itemgetter(-1), merged)

dest.writelines(undecorated)

上面的每一步都是“懒惰”.当我避免使用file.readlines()时,会根据需要读取文件中的行.同样,装饰过程使用生成器表达式而不是list-comps. heapq.merge()也很懒惰 – 每个输入迭代器需要一个项目来进行必要的比较.最后我使用的是itertools.imap(),它是内置的undecorate的map()的惰性变体.

(在Python 3中map()变得很懒,所以你可以使用那个)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值