每行是一條記錄,每行可以有多列,列間按預定義的分隔符分隔;
可以按單列或多列組合排序,每列的順序可以設定為反序或者正序;
列的資料型別可以是字串、整數、浮點數,比較排序時按指定的資料型別比較大小;
排序演算法可以單執行緒執行(適用於小檔案),也可以多執行緒執行(適用於大檔案,分隔排序後再歸併);
使用了如下技術要點:命令列引數物件導向字串解析檔案讀取,寫入多執行緒、執行緒池、佇列、執行緒同步檔案歸併排序
匯入的庫:
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 ...