Python之超大文件文本处理源代码

文章资讯 2020-02-20 14:04:50

Python之超大文件文本处理源代码

#去文本重复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()  # 运行程序