#去文本重复import time # 载入时间计算模块
import threading # 载入多线程模块
import io #载入虚拟内存文件模块
lists=list() # 将变量赋值成列表类型
sio = io.StringIO()
timem = time.time() # 记录首次运行时间
gather = set() # 将gather(集合)设置为集合型
file = input("请输入文本位置:")
Newfile = open(file+"NEW.txt", 'w+') # 取重复后保存的文件
value = 0
def RunRead(Thread,who): # 定义处理重复函数
global gather # 获得集合变量的权限
global Newfile # 获得文件属性的权限
global value # 获得值value(即线程等差数列)的权限
global lists # 获得列表权限
i = Thread # 将第n个线程赋值给i
record = who # 保存第n个线程 保留计次线程
Repeat=enumerate(open(file, 'r')) # 欲写入文件准备 将要去重复的文件读取进来
for cur_line_number, line in Repeat: # 循环获取第n行文本
if cur_line_number+1 == i: # 判断第n行是否与i一致
gather.add(line) # 向集合插入一个值
print(i,Thread) # 输出去重复到第几个了和哪个线程执行的
i += record # 自增保留的计次线程
else: # 如果去重复完毕执行保存文件
value = value+i-cur_line_number-1 # 1加到线程总数
if value==(who*(1+who))/2: # 判断是否去重复完毕 / 1加到线程总数
lists = list(gather)
OpenThreadTO() # 创建写入文件线程
Backup=0
def save(Thread,who):#创建写入文件函数
global sio # 获得虚拟io属性权限
global lists # 获得列表权限
global Backup # 获得用于记录自增Thread权限
i = Thread # 将第n个线程赋值给i
while Thread < len(lists):# 判断并循环去重复后的行数
# Newfile.write(list(gather)[Thread]) # 向硬盘写入第n行
sio.write(lists[Thread]) # 写入虚拟内存
print("正在写入第%d行" % (Thread + 1), "一共%d行" % len(list(gather)),i+1) # 输出写到第n行和输出一共要写入多少行
Backup = Backup + Thread # 记录自增Thread用于判断是否写入虚拟内存完毕
if Backup==len(lists)*(0+len(lists)-1)/2: # 判断两值是否相等 如果相等写入从虚拟内存写入硬盘
Newfile.write(sio.getvalue()) # 从虚拟内存写入硬盘
print(time.time() - timem) # 循环结束后输出去重复和写入文件的总时间
Thread += who # 第n行递增
Multithreading = 100 # 输入线程数量
def OpenThread(): # 创建去重复线程函数
global Multithreading # 获得线程数量权限
for i in range(Multithreading): # 循环第n个线程
threading.Thread(target=RunRead,args=(i+1,Multithreading)).start() # 创建并执行多线程
def OpenThreadTO(): # 创建写入文件线程函数
global Multithreading # 获得线程数量权限
for i in range(Multithreading): # 循环第n个线程
threading.Thread(target=save,args=(i,Multithreading)).start() # 创建并执行多线程
OpenThread() # 运行程序