Python 實現文字檔案多路歸併排序

2021-07-31 15:26:29 字數 3009 閱讀 6970

每行是一條記錄,每行可以有多列,列間按預定義的分隔符分隔;

可以按單列或多列組合排序,每列的順序可以設定為反序或者正序;

列的資料型別可以是字串、整數、浮點數,比較排序時按指定的資料型別比較大小;

排序演算法可以單執行緒執行(適用於小檔案),也可以多執行緒執行(適用於大檔案,分隔排序後再歸併);

使用了如下技術要點:命令列引數物件導向字串解析檔案讀取,寫入多執行緒、執行緒池、佇列、執行緒同步檔案歸併排序

匯入的庫:

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 -o [-d ] [-c ] [-s ] [-t ]

-i 輸入源檔名

-o 輸出目標檔名,如果未指定,則結果覆蓋到原始檔

-d 可選項,檔案文字行的列分隔符,預設是空格

-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:

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

作品:

Python實現大文字檔案分割

python 2 通過檔案拖拽或檔案路徑輸入,實現自定義大文字檔案分割。coding gbk import os,sys,shutil is file exits false while not is file exits files list if len sys.ar 1 print 請輸入要切...

python 讀寫文字檔案

本人最近新學python 用到文字檔案的讀取,經過一番研究,從網上查詢資料,經過測試,總結了一下讀取文字檔案的方法.a f open filename r content f.read decode utf 8 b f codecs.open encoding utf 8 content f.rea...

Python讀取文字檔案

給定c data hello.txt,內容如下 jack hello,how are you?rose i m good.按行讀取 filepath r c data hello.txt with open filepath as txtfile for line in txtfile print ...