开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 5708|回复: 16
收起左侧

[易语言纯源码] Python之超大文件处理

[复制链接]
结帖率:51% (19/37)
发表于 2019-1-20 20:48:15 | 显示全部楼层 |阅读模式   广东省佛山市
分享源码
界面截图: -
是否带模块: -
备注说明: -
本帖最后由 903935604 于 2019-1-20 20:49 编辑

#今天花了一天写的,我也是刚学python一个月。可以处理超大文件#亲测处理一亿行文本没问题。

QQ截图20190120204930.png
#去文本重复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()  # 运行程序

评分

参与人数 1好评 +1 精币 +2 收起 理由
huaidan2015 + 1 + 2 支持开源~!感谢分享

查看全部评分


本帖被以下淘专辑推荐:

结帖率:96% (47/49)

签到天数: 6 天

发表于 2019-6-4 01:16:30 | 显示全部楼层   湖南省长沙市
奉上小小红包希望笑纳  
回复 支持 反对

使用道具 举报

签到天数: 1 天

发表于 2019-4-26 23:24:55 | 显示全部楼层   贵州省遵义市
厉害了,非常厉害
回复 支持 反对

使用道具 举报

结帖率:98% (43/44)

签到天数: 18 天

发表于 2019-4-18 10:45:12 | 显示全部楼层   吉林省吉林市
python 调用函数没有易语言提示的这么舒服
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)
发表于 2019-4-13 20:27:14 | 显示全部楼层   广西壮族自治区崇左市
酷酷酷酷酷酷
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)
发表于 2019-1-24 21:40:31 | 显示全部楼层   北京市北京市
加分加分,为啥不学php
回复 支持 反对

使用道具 举报

结帖率:51% (19/37)
 楼主| 发表于 2019-1-23 13:41:25 | 显示全部楼层   广东省佛山市
a474335897 发表于 2019-1-20 22:48
其实不需要这么麻烦的,python有个内置函数叫readlines
f=open("fdsf.txt","r",encoding="utf-8") # 这里 ...

不是代码长就是麻烦 你的方法之前都用过
回复 支持 反对

使用道具 举报

发表于 2019-1-22 09:03:07 | 显示全部楼层   湖南省长沙市
一般这种情况还要把处理的时间对比发出来
回复 支持 反对

使用道具 举报

结帖率:100% (4/4)
发表于 2019-1-21 13:18:22 | 显示全部楼层   山东省济南市
谢谢楼主的分享
回复 支持 反对

使用道具 举报

结帖率:99% (71/72)
发表于 2019-1-21 12:40:49 | 显示全部楼层   广东省深圳市
还每一行都注解了
回复 支持 反对

使用道具 举报

结帖率:100% (7/7)

签到天数: 18 天

发表于 2019-1-21 12:04:29 | 显示全部楼层   广东省云浮市
兄弟,发错版块了吧
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 诚聘英才| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表