我有一个已排序文件的列表,其中数据以'\ n'分隔。我想将它们合并在一起以获取单个已排序的文件。我不想一次性加载所有文件的内容。我正在使用 heapq库的合并功能
我写了以下代码
def merge(*flist):
for element in heapq.merge(*flist):
yield element
其中* flist是这样的元组 -
(<open file '/tmp/000000', mode 'w+b' at 0xb73eba70>,
<open file '/tmp/000001', mode 'w+b' at 0xb73ebac8>,
<open file '/tmp/000002', mode 'w+b' at 0xb73ebb20>,
<open file '/tmp/000003', mode 'w+b' at 0xb73ebb78>,
<open file '/tmp/000004', mode 'w+b' at 0xb73ebc80>)
当我在循环中打印元素时,我得到的值是'2 \ n','44 \ n'。输出文件也不在排序顺序中。我认为问题是由于新的行字符。如何解决这个问题。
我试图在相当长的时间内解决这个问题,但无法解决它
答案 0 :(得分:5)
将输入行转换为整数以获得数字排序而不是字符串排序:
def merge(*flist):
return heapq.merge(*[itertools.imap(int, f) for f in flist])
请注意,迭代heapq.merge
迭代器并产生每个元素是没有意义的。您只需返回迭代器并保存一个间接层即可。 (事实上,您的功能的原始版本可以替换为heapq.merge
,而不会对呼叫站点进行任何更改。)