py新手求教如何统计文本文件中的重复数据

yalan 2020-02-21 11:29:26
文本格式如下,每行一条登录退出信息,首列为账号:
123abc|2019-10-22|登录|2019-10-23|退出
223cbc|2019-10-22|登录|2019-10-24|退出
323xbc|2019-10-23|登录|2019-10-23|退出
123abc|2019-10-24|登录|2019-10-26|退出

想要筛选出这个文件中账号相同的信息,即只保留
123abc|2019-10-22|登录|2019-10-23|退出
123abc|2019-10-24|登录|2019-10-26|退出

其实就是想要统计这个文件中账号登录的次数大于一次的

文件大小为40G,数十亿行。。。。导入数据库处理也不现实,求教高手。py新手,刚学一周,希望能写完整可执行的代码
...全文
174 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
yalan 2020-02-22
  • 打赏
  • 举报
回复
引用 2 楼 冰风漫天 的回复:
大概的思路是写两个循环,第一个循环读文件把主键存在字典,第二个循环主键判断和写文件,以下是python3.7的代码,python2.7的文件读写略有差别,open函数不带encoding参数

dic = {}
with open('a.txt', encoding='utf-8') as fr:
    line = fr.readline()
    while line:
        x = line.split('|')
        key = x[0]
        if key in dic:
            dic[key] += 1
        else:
            dic[key] = 1
        line = fr.readline()

with open('a.txt', encoding='utf-8') as fr, open('b.txt', encoding='utf-8', mode='w+') as fw:
    line = fr.readline()
    while line:
        x = line.split('|')
        key = x[0]
        if dic[key]>1:
            fw.write(line)
        line = fr.readline()
如果主键是账号名称之类的话,一般来说内存是存的下的,如果你的主键多到内存都存不下的话,实现就要复杂很多,追求性能的情况下还是要按内存能存的下的数量去切分。
非常感谢,我试下哈
yalan 2020-02-22
  • 打赏
  • 举报
回复
引用 1 楼 天不绝我 的回复:
逐行读取 for line in open("foo.txt"): print line 创建一个字典 key是帐号 value是次数
这根本行不通,我虽然初学,看文档字典是存在内存中的,这几十G的文本文件怎么能都读到dict(即内存)中? 直接把电脑干崩溃了
冰风漫天 2020-02-22
  • 打赏
  • 举报
回复
大概的思路是写两个循环,第一个循环读文件把主键存在字典,第二个循环主键判断和写文件,以下是python3.7的代码,python2.7的文件读写略有差别,open函数不带encoding参数

dic = {}
with open('a.txt', encoding='utf-8') as fr:
    line = fr.readline()
    while line:
        x = line.split('|')
        key = x[0]
        if key in dic:
            dic[key] += 1
        else:
            dic[key] = 1
        line = fr.readline()

with open('a.txt', encoding='utf-8') as fr, open('b.txt', encoding='utf-8', mode='w+') as fw:
    line = fr.readline()
    while line:
        x = line.split('|')
        key = x[0]
        if dic[key]>1:
            fw.write(line)
        line = fr.readline()
如果主键是账号名称之类的话,一般来说内存是存的下的,如果你的主键多到内存都存不下的话,实现就要复杂很多,追求性能的情况下还是要按内存能存的下的数量去切分。
放风喽 2020-02-22
  • 打赏
  • 举报
回复
逐行读取
for line in open("foo.txt"):
print line

创建一个字典
key是帐号
value是次数

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧