合并两个文件,用数字排序,每行一个整数,不读入内存,也不进行排序

时间:2015-01-10 05:00:23

标签: python merge python-3.4

我有两个文件,file1和file2,按第2列数字排序:

文件1

A 1
B 10

file2的

C 2
D 100

我想合并它们并得到这个输出,它也按第2列数字排序:

D 1
B 2
C 10
A 100

我可以使用这个unix命令来完成它,它不会排序,但会合并预先排序的文件:

sort -m -k2n,2 file1 file2

但是如何在没有将文件读入内存且没有排序的情况下在Python 3.4中执行此操作? Python 3.5将根据docs.python.orgbugs.python.orggithub.com向heapq.merge()添加一个关键参数,但不提供预发布。与此同时,我想出了下面的解决方案。有更优雅的方式吗?我可以使用map并循环使用这两个文件吗?也许我应该发布到codereview呢?

import heapq

def key_generator(fd):
    for line in fd:
        yield int(line.split()[1]), line

with open('file1') as fd1, open('file2') as fd2:

    it1 = key_generator(fd1)
    it2 = key_generator(fd2)
    for key, line in heapq.merge(it1, it2):
        print(line, end='')

2 个答案:

答案 0 :(得分:1)

我刚刚下载了Python3.5的alpha版本1,我可以使用key function的新heapq.merge()来完成它:

from heapq import merge

def keyfunc(s):
    return int(s.split()[1])

with open('file1') as fd1, open('file2') as fd2:
    for line in merge(fd1, fd2, key=keyfunc):
        print(line)

或者那些喜欢一行lambda函数的人:

key=lambda line: int(line.split()[1])

我可以使用map,operator.itemgetter(),str.split和int在一行中完成此操作吗?

答案 1 :(得分:-2)

  

你可以试试这种方式

dict={}

with open("a.txt",'r') as f1, open("b.txt",'rb') as f2:
    lines_a=f1.readlines()
    lines_b=f2.readlines()
    for line in lines_a:
        dict.update({line.split()[0]:int(line.split()[1])})

    for line in lines_b:
        dict.update({line.split()[0]:int(line.split()[1])})

for w in sorted(dict, key=dict.get):
  print w,(dict[w])