Python 实现文本文件多路归并排序

原创 2017年05月05日 15:11:49
开发说明:前两天刚开始学习Python,但是厌烦了Hello World这类没用的东东,于是就自己边学边做,花了一天时间完成了这个稍微复杂的小应用;

麻雀虽小五脏俱全,作为初学者的例程还是很有指导意义的,真正做到从入门到精通,欢迎大家指正。

文本文件内容排序功能:

每行是一条记录,每行可以有多列,列间按预定义的分隔符分隔;

可以按单列或多列组合排序,每列的顺序可以设置为反序或者正序;

列的数据类型可以是字符串、整数、浮点数,比较排序时按指定的数据类型比较大小;

排序算法可以单线程执行(适用于小文件),也可以多线程执行(适用于大文件,分隔排序后再归并);

使用了如下技术要点:命令行参数面向对象字符串解析文件读取,写入多线程、线程池、队列、线程同步文件归并排序

导入的库:

import sysimport getopt

import threading

import time

import queue from functools 

import cmp_to_key from tempfile 

import TemporaryFile from datetime

import datetime

命令行说明:sort.py -i <input_filename> -o <output_filename> [-d <delimeter>] [-c <columns>] [-s <size>] [-t <threadCount>]

-i 输入源文件名

-o 输出目标文件名,如果未指定,则结果覆盖到源文件

-d 可选项,文件文本行的列分隔符,默认是空格

-c 可选项,相关排序列信息,包括列号(从1开始,按出现顺序优先级排序)、数据类型(i:整数,f:浮点数,默认:字符串)、是否反序(r),   默认按第一列字符串类型正序(升序)排序

-s 可选项,源文件分段最大行数,如果不指定则单线程执行,否则多线程执行排序

-t 可选项,线程数,指定-s参数时生效,默认值:2

示例:python sort.py -i d:/test.txt -o d:/test1.txt -c 4ir,3f,5 -s 10000 -t 3

关键的类:

class Column:  # 列信息对象
    # 列下标 index = 0
    # 是否反序,默认正序 reverse = False
    # 列数据类型 String:0 Int:1 Float:2
    # data_type = 0


    def __init__(self, index, reverse, data_type):
        self.index = index
        self.reverse = reverse
        self.data_type = data_type


    @classmethod  # 类方法
    def parse(cls, s):
        reverse = False
        data_type = 0
        min_index = len(s)
        i = s.find('r')
        if i > -1:
            reverse = True
            if i < min_index:
                min_index = i
        i = s.find('i')
        if i > -1:
            data_type = 1
            if i < min_index:
                min_index = i
        i = s.find('f')
        if i > -1:
            data_type = 2
            if i < min_index:
                min_index = i
        index = int(s[0:min_index]) - 1
        return Column(index, reverse, data_type)




class Line:  # 行对象
    # 行文本
    # line = ''
    # 排序比较的列
    # columns = []


    def __init__(self, line, columns):
        self.line = line
        self.columns = columns


    @classmethod
    def parse(cls, line):
        all_columns = line.split(Config.delimeter)
        all_len = len(all_columns)
        columns = []
        for column in Config.column_info_list:
            index = column.index
            if index < all_len:
                columns.append(all_columns[index])
        return Line(line, columns)




排序比较函数的实现:


def cmp_line(l1, l2):  # 比较函数
    len1 = len(l1.columns)
    len2 = len(l2.columns)
    for i in range(len1):
        column_info = Config.column_info_list[i]
        if i >= len2:
            return -1 if column_info.reverse else 1
        c1 = l1.columns[i]
        c2 = l2.columns[i]
        if column_info.data_type == 1:
            c1 = int(c1)
            c2 = int(c2)
        elif column_info.data_type == 2:
            c1 = float(c1)
            c2 = float(c2)
        if c1 > c2:
            return -1 if column_info.reverse else 1
        elif c1 < c2:
            return 1 if column_info.reverse else -1
            # len1 < len2
    return 0 if len1 == len2 else 1 if Config.column_info_list[len1].reverse else -1


全部的代码下载链接

http://download.csdn.net/detail/u011606457/9834791


作品:http://bss.csdn.net/m/product/python_creative/opus

版权声明:本文为博主原创文章,未经博主允许不得转载。

Python文件操作及多路归并排序

  • 2017年05月05日 20:53
  • 401KB
  • 下载

【Python排序搜索基本算法】之归并排序

归并排序最令人兴奋的特点是:不论输入是什么样的,它对N个元素的序列排序所用时间与NlogN成正比。代码如下: def mergesort(seq): if len(seq)...
  • littlethunder
  • littlethunder
  • 2013年07月25日 18:37
  • 12244

多路归并外排序的C/C++完整实现(数据自动随机生成,菜单化,很容易操作)

  • 2017年11月05日 21:00
  • 4.26MB
  • 下载

Python-排序

list.sort()方法此函数方法对列表内容进行正向排序,排序后的新列表会覆盖原列表,sort排序方法是直接修改原列表list a = [5, 7, 6, 3, 4, 1, 2] a.sort(...
  • cdl2008sky
  • cdl2008sky
  • 2018年01月09日 13:30
  • 72

经典排序之多路归并

多路归并排序
  • u010367506
  • u010367506
  • 2014年04月16日 21:26
  • 5679

Python 实现归并排序

# Merges two sorted lists to create and return a new sorted list def mergeSortedLists(listA, listB):...
  • guaguastd
  • guaguastd
  • 2015年01月19日 15:53
  • 721

经典排序之多路归并

多路归并排序
  • u010367506
  • u010367506
  • 2014年04月16日 21:26
  • 5679

7.7.3 多路平衡归并与败者树

归并趟数S=[logm R](向下取整)。从而增加归并路数m可以减少归并趟数S,进而减少访问外存的次数(I/O次数)。然而,当增加归并路数m时,内部归并时间将增加。做内部归并时,在m个元素中选择关键字...
  • jxq0816
  • jxq0816
  • 2016年09月09日 18:59
  • 830

海量数据排序,多路平衡归并算法及实现(外部文件排序算法)

外部文件多路平衡归并类似于内部排序的归并算法。可知增加分段个数k可以减少归并次数s,从而减少外存读写次数,但是单纯增加k将会导致增加内部归并的时间。 对于k-路归并,令u个记录分布在k个归并段上,显...
  • yu_xie_12
  • yu_xie_12
  • 2015年04月14日 21:49
  • 1007

大数据多路归并排序

多路归并排序 问题 给你1个文件bigdata,大小4663M,5亿个数,文件中的数据随机,如下一行一个整数: 6196302 3557681 6121580 2039345...
  • wongson
  • wongson
  • 2015年10月17日 23:36
  • 7983
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Python 实现文本文件多路归并排序
举报原因:
原因补充:

(最多只允许输入30个字)