• 本节内容的数据见电脑F:\python数据\Python海量数据(精缩版)百度网盘“我的数据文件/Python海量数据”

一、先了解下QQ群的数据

1.QQ目录下的文件


(QQ目录下的文件是按照QQ群号有序排列的,我们根据QQ群找这个群里的QQ就很方便,但要是根据一个人的QQ找它所在的群这就麻烦了)

2.QQqun目录下的文件



(因为数据是有序的,两个文件归并的时候就不用排序)




以下是对QQ群数据的合并、检索、制作索引、快速查找



一、QQ群数据的合并

1.把这么多文件里面的数据合并到一个大文件里去

import osfiledir="/mnt/hgfs/E/QQ项目/QUN/qqQun"
filelist=[]
for i in range(1,111):  #该目录下一共有110个数据文件filelist.append(filedir+"/QunList"+str(i)+".txt")#filelist=["/mnt/hgfs/E/QQ项目/QUN/qqQun/QunList1.txt","/mnt/hgfs/E/QQ项目/QUN/qqQun/QunList2.txt",,,]allfile=open("/mnt/hgfs/E/QQ项目/QUN/qqQun/allQQqun.txt","wb")
for  filepath in filelist:tmpfile = open(filepath, "rb")tmplist=tmpfile.readlines()for line   in tmplist:allfile.write(line)tmpfile.close()allfile.close()

2.把这么多文件里面的数据进行处理然后再合并到一个大文件里去




filedir="/mnt/hgfs/E/newQQ/QQqun"filelist=[]
for i in range(1,111):filelist.append(filedir+"/QunList"+str(i)+".txt")allqunfile=open("/mnt/hgfs/E/newQQ/QQqunalllite.txt","wb")for  filepath in filelist:tmpfile = open(filepath, "rb")tmplist = tmpfile.readlines()for line in tmplist:line=line.decode("utf-8","ignore") #解码linelist=line.split("\t") #切割if len(linelist)==7:  #如果改行不是7个数据,说明改行缺失信息,那么就是垃圾数据,我们不做处理Qunid=linelist[1].replace("\"","")Qunname=linelist[4].replace("\"", "")Quntitle=linelist[6].replace("\"", "")#抓取重要的数据,替换符号,wline=Qunid+"\t"+Qunname+"\t"+Quntitleallqunfile.write(wline.encode("utf-8"))allqunfile.close()

二、补充:jieba库如何做到模糊搜索

1.jieba库

import  jieba
mystr="我今天与朋友聊天聊到了美女与野兽"
mycut=jieba.cut(mystr)
print(",".join(mycut))  #我,今天,与,朋友,聊天,聊到,了,美女,与,野兽
print("--".join(mycut))  #我--今天--与--朋友--聊天--聊到--了--美女--与--野兽


2.分词搜索

import  jieba
import jieba.posseg
mystr="软件工程"
laststr="软件工程1班"
jiebastr=",".join(jieba.cut(mystr,cut_all=True))  #这种分词会罗列出所有的分词可能:['软件', '软件工程', '工程']
wordlist=jiebastr.split(",")  #jiebastr=软件,软件工程,工程    wordlist=['软件', '软件工程', '工程']
print(wordlist)
length=len(wordlist)
getlength=0
for  word  in wordlist:if  laststr.find(word)!=-1:  getlength+=1
print(getlength/length)

三、信息搜索

我们根据刚刚合并的数据,从里面搜索”妈妈“,得到的那些群号就可以做母婴用品的推销
从里面搜索”软件工程“就可以向那些群号做IT方面的培训广告

1.常规的普通搜索

filepath="/mnt/hgfs/E/newQQ/QQqunalllite.txt"
datafile=open(filepath,"rb")
while True:searchstr=input("要查询的数据")datafile.seek(0,0)while True:line =datafile.readline()if not line:  #(读到最后一行就跳出循环)breakelse:line =line.decode("utf-8")if line.find(searchstr)!=-1:print(line,end="")datafile.close()



2.模糊搜索

import  jieba
import jieba.possegdef  findata(mystr,laststr):jiebastr=",".join(jieba.cut(mystr,cut_all=True))wordlist=jiebastr.split(",")length=len(wordlist)getlength=0for  word  in wordlist:if  laststr.find(word)!=-1:getlength+=1return getlength/lengthfilepath="/mnt/hgfs/E/newQQ/QQqunalllite.txt"
datafile=open(filepath,"rb")
datalist=datafile.readlines()  #这种一次性读取所有行的做法就是将几G的数据一次性读入内存,好处是读入以后查询非常快
print("load mem")while True:searchstr=input("要查询的数据")datafile.seek(0,0)for  line  in datalist:line =line.decode("utf-8")#if line.find(searchstr)!=-1:if findata(searchstr,line)>=0.3:  #匹配系数只要大于0.3那就输出来(这样就比之前查出来的数据更多)print(line,end="")datafile.close()

五、制作索引

我们根据刚刚合并的数据,制作索引

1.第一种土豪的做法— 一次性读入

filepath="/mnt/hgfs/E/newQQ/QQqunalllite.txt"
Qunfile=open(filepath,"rb")
Qunlist=Qunfile.readlines()  #一次性读入内存,土豪的做法
print(len(Qunlist)) #86907937lengthlist=[0]
for line in Qunlist:lengthlist.append(len(line))
del Qunlist
print("list")i=1
length=len(lengthlist)
while i<length-1:lengthlist[i]+=lengthlist[i-1]i+=1
del  lengthlist[length-1] #删除最后一位
print("sort")savefilepath="/mnt/hgfs/E/newQQ/QQqunallliteindex.txt"
savefile=open(savefilepath,"wb")
for  data in lengthlist:savefile.write(format(data,"15d").encode("utf-8"))savefile.close()
Qunfile.close()

2.比较节约内存的做法— 一行一行的读入

filepath="/mnt/hgfs/E/newQQ/QQqunalllite.txt"
Qunfile=open(filepath,"rb")lengthlist=[0]
while True:line=Qunfile.readline() #一行一行的读入if  not line:breakelse:lengthlist.append(len(line))print("list")i=1
length=len(lengthlist)
while i<length-1:lengthlist[i]+=lengthlist[i-1]i+=1
del  lengthlist[length-1]
print("sort")savefilepath="/mnt/hgfs/E/newQQ/QQqunallliteindex_disk1.txt"
savefile=open(savefilepath,"wb")
for  data in lengthlist:savefile.write(format(data,"15d").encode("utf-8"))savefile.close()
Qunfile.close()

3.最有利于内存的方法-----边读边写

filepath="/mnt/hgfs/E/newQQ/QQqunalllite.txt"
Qunfile=open(filepath,"rb")
savefilepath="/mnt/hgfs/E/newQQ/QQqunallliteindex_disk2.txt"
savefile=open(savefilepath,"wb")pos=0
savefile.write(format(pos,"15d").encode("utf-8"))while True:line=Qunfile.readline()if  not line:breakelse:pos +=len(line)savefile.write(format(pos, "15d").encode("utf-8"))savefile.close()
Qunfile.close()

六、根据索引快速查找


1.随机访问

csdnfilepath="/mnt/hgfs/E/newQQ/QQqunalllite.txt"
csdnindexfilepath="/mnt/hgfs/E/newQQ/QQqunallliteindex.txt"
csdnfile=open(csdnfilepath,"rb")
csdnindexfile=open(csdnindexfilepath,"rb")while True:linenum=eval(input("input lines"))csdnindexfile.seek(15*(linenum-1),0) #跳到索引文件的中间位置lineval=csdnindexfile.read(15)#读取10个字符lineval=eval(lineval)#转化为数字csdnfile.seek(lineval,0) #根据索引取出位置line=csdnfile.readline()line=line.decode("utf-8","ignore")print(line)csdnindexfile.close()
csdnfile.close()


2.二分查找

def search2(searchstr):low = 0  # 第一个high = 86907937-1  # 代表最后一个times = 0while low <= high:  # 不能重叠times += 1print("times", times)mid = (low + high) // 2  # 取出中间索引csdnindexfile.seek(15 * (mid - 1), 0)  # 跳到索引文件的中间位置lineval = csdnindexfile.read(15)  # 读取10个字符lineval = eval(lineval)  # 转化为数字csdnfile.seek(lineval, 0)  # 根据索引取出位置line = csdnfile.readline()line = line.decode("utf-8", "ignore")linelist=line.split("\t")middata=linelist[0]if searchstr< middata:  # 小于 淘汰1半high = mid - 1elif searchstr > middata:  # 小于 淘汰1半low = mid + 1else:print("find", line, mid)return midprint("not find")return -1csdnfilepath="/mnt/hgfs/E/newQQ/QQqunalllite.txt"
csdnindexfilepath="/mnt/hgfs/E/newQQ/QQqunallliteindex.txt"
csdnfile=open(csdnfilepath,"rb")
csdnindexfile=open(csdnindexfilepath,"rb")while True:searchstr=input("input searchstr")  #输入你要查找的字符串search2(searchstr)csdnindexfile.close()
csdnfile.close()






以下是对QQ文件的合并、制作索引、根据索引迅速查找




一、合并QQ文件

右边文件中依次是(编号、QQ号、QQ名、年龄、性别、 ? 、QQ群号)



我们依次拿到(QQ号:21605735、QQ名:晴子、年龄:22,QQ群号:100100)

filedir="/mnt/hgfs/E/newQQ/QQ"filelist=[] #文件列表
for i in range(1,111): #批量生成110个文件加入列表filelist.append(filedir+"/Group"+str(i)+".txt")#用于归并的文件
allqunfile=open("/mnt/hgfs/E/newQQ/QQall.txt","wb")
#每个文件读取一次,每个文件写入归并的文件
for  filepath in filelist:print(filepath)tmpfile = open(filepath, "rb") #打开文件tmplist = tmpfile.readlines() #读取所有行for line in tmplist: #所有文件的行,批量写入归并line=line.decode("utf-8")linelist=line.split("\t")QQ= linelist[1].replace("\"", "")QQname = linelist[2].replace("\"", "")QQage = linelist[3].replace("\"", "")QQqun = linelist[6].replace("\"", "")# 抓取重要的数据,替换符号,wline = QQ + "\t" + QQname  + "\t" +QQage +"\t"+QQqunallqunfile.write(wline.encode("utf-8"))allqunfile.close()

得到的文件是按照QQ群号有序排列的,所以它比较适合根据QQ群号找这个群里的QQ号

二、QQ数据的索引

QQall.txt文件是按照QQ群号有序排列的,所以它比较适合根据QQ群号找这个群里的QQ号

filepath="/mnt/hgfs/E/newQQ/QQall.txt"
Qunfile=open(filepath,"rb")
savefilepath="/mnt/hgfs/E/newQQ/QQallindex.txt"
savefile=open(savefilepath,"wb")
pos=0
savefile.write(format(pos,"15d").encode("utf-8"))while True:line=Qunfile.readline()if  not line:breakelse:pos +=len(line)savefile.write(format(pos, "15d").encode("utf-8"))savefile.close()
Qunfile.close()

三、根据索引随机访问QQ群

csdnfilepath="/mnt/hgfs/E/newQQ/qun_data/qun_name_qq.txt"
csdnindexfilepath="/mnt/hgfs/E/newQQ/qun_data/qun_qq_index.txt"
csdnfile=open(csdnfilepath,"rb")
csdnindexfile=open(csdnindexfilepath,"rb")while True:linenum=eval(input("input lines"))csdnindexfile.seek(15*(linenum-1),0) #跳到索引文件的中间位置lineval=csdnindexfile.read(15)#读取15个字符lineval=eval(lineval)#转化为数字csdnfile.seek(lineval,0) #根据索引取出位置line=csdnfile.readline()line=line.decode("utf-8","ignore")print(line)csdnindexfile.close()
csdnfile.close()

四、根据QQ群查找QQ

def search2(searchstr):low = 0  # 第一个high = 1449403409-1  # 代表最后一个while low <= high:  # 不能重叠mid = (low + high) // 2  # 取出中间索引csdnindexfile.seek(15 * (mid - 1), 0)  # 跳到索引文件的中间位置lineval = csdnindexfile.read(15)  # 读取15个字符lineval = eval(lineval)  # 转化为数字csdnfile.seek(lineval, 0)  # 根据索引取出位置line = csdnfile.readline()line = line.decode("utf-8", "ignore")linelist=line.split(" # ")middata=linelist[2]middata=eval(middata)if searchstr< middata:  # 小于 淘汰1半high = mid - 1elif searchstr > middata:  # 小于 淘汰1半low = mid + 1else:#print("find",  mid,line)QQlist=[]QQlist.append(line) # 返回一个列表,多个QQ,先加入找到的第一个tmp_up=mid   #循环,向上查找while True:tmp_up-=1  #循环向上if tmp_up<low: #不可以低于下限break#索引文件取出位置tmp_upcsdnindexfile.seek(15 * (tmp_up - 1), 0) uplineval = csdnindexfile.read(15)  # 读取15个字符uplineval = eval(uplineval)  # 转化为数字# 根据索引文件在文件中取出位置tuplinelist[2]群号csdnfile.seek(uplineval, 0)  # 根据索引取出位置upline = csdnfile.readline()upline = upline.decode("utf-8", "ignore")uplinelist = upline.split(" # ")upmiddata = uplinelist[2]upmiddata = eval(upmiddata)if searchstr== upmiddata : #相等就继续,不等跳出循环#print(upline,tmp_up)QQlist.append(upline)else:breaktmp_down=mid #向下循环while True:tmp_down+=1 #向下移动,if tmp_down>high: #不能高于上限break# 索引文件取出位置tmp_downcsdnindexfile.seek(15 * (tmp_down - 1), 0)  downlineval = csdnindexfile.read(15) downlineval = eval(downlineval)  # 转化为数字# 根据索引文件在文件中取出位置tuplinelist[2]群号csdnfile.seek(downlineval, 0)  # 根据索引取出位置downline = csdnfile.readline()downline = downline.decode("utf-8", "ignore")downlinelist = downline.split(" # ")downmiddata = downlinelist[2]downmiddata = eval(downmiddata)if searchstr == downmiddata :#相等就继续,不等跳出循环#print(downline, tmp_down)QQlist.append( downline )else:breakreturn QQlistprint("not find")return -1csdnfilepath="/mnt/hgfs/E/newQQ/qun_data/qun_name_qq.txt"
csdnindexfilepath="/mnt/hgfs/E/newQQ/qun_data/qun_qq_index.txt"
csdnfile=open(csdnfilepath,"rb")
csdnindexfile=open(csdnindexfilepath,"rb")while True:searchstr=eval(input("input searchstr"))QQlist=search2(searchstr)for QQline in QQlist:print(QQline,end="")csdnindexfile.close()
csdnfile.close()

五、根据QQ查找它所在的QQ群


那么如何根据QQ查找它所在的QQ群呢?
按理来讲我们要根据QQ查找它所在的QQ群需要一份按照QQ号排列的正序文件
下面的qq_name_qun.txt是乱序的,它虽然从QQ群号上看是正序的,但是从QQ号上看是乱序的,所以我们做了一份倒排索引文件(index.txt是按照QQ号正序排列制作的的索引,只要有一个正序的索引,就可以了)

根据QQ查找它所在的QQ群

def search2(searchstr):low = 0  # 第一个high = 1449403409-1  # 代表最后一个while low <= high:  # 不能重叠mid = (low + high) // 2  # 取出中间索引csdnindexfile.seek(15 * (mid - 1), 0)  # 跳到索引文件的中间位置lineval = csdnindexfile.read(15)  # 读取15个字符lineval = eval(lineval)  # 转化为数字csdnfile.seek(lineval, 0)  # 根据索引取出位置line = csdnfile.readline()line = line.decode("utf-8", "ignore")linelist=line.split(" # ")middata=linelist[0]#middata=eval(middata)if searchstr< middata:  # 小于 淘汰1半high = mid - 1elif searchstr > middata:  # 小于 淘汰1半low = mid + 1else:QQlist = []QQlist.append(line)  # 返回一个列表,多个QQ,先加入找到的第一个tmp_up = mid  # 循环,向上查找while True:tmp_up -= 1  # 循环向上if tmp_up < low:  # 不可以低于下限breakif  tmp_up-1<0:break# 索引文件取出位置tmp_upcsdnindexfile.seek(15 * (tmp_up - 1), 0)  # 跳到索引文件的中间位置uplineval = csdnindexfile.read(15)  # 读取10个字符uplineval = eval(uplineval)  # 转化为数字# 根据索引文件在文件中取出位置tuplinelist[2]群号csdnfile.seek(uplineval, 0)  # 根据索引取出位置upline = csdnfile.readline()upline = upline.decode("utf-8", "ignore")uplinelist = upline.split(" # ")upmiddata = uplinelist[0]#upmiddata = eval(upmiddata)if searchstr == upmiddata:  # 相等就继续,不等跳出循环# print(upline,tmp_up)QQlist.append(upline)else:breaktmp_down = mid  # 向下循环while True:tmp_down += 1  # 向下移动,if tmp_down > high:  # 不能高于上限break# 索引文件取出位置tmp_downcsdnindexfile.seek(15 * (tmp_down - 1), 0)  # 跳到索引文件的中间位置downlineval = csdnindexfile.read(15)  # 读取10个字符downlineval = eval(downlineval)  # 转化为数字# 根据索引文件在文件中取出位置tuplinelist[2]群号csdnfile.seek(downlineval, 0)  # 根据索引取出位置downline = csdnfile.readline()downline = downline.decode("utf-8", "ignore")downlinelist = downline.split(" # ")downmiddata = downlinelist[0]#downmiddata = eval(downmiddata)if searchstr == downmiddata:  # 相等就继续,不等跳出循环# print(downline, tmp_down)QQlist.append(downline)else:breakreturn QQlistprint("not find")return -1csdnfilepath="/mnt/hgfs/E/newQQ/qq_data/qq_name_qun.txt"
csdnindexfilepath="/mnt/hgfs/E/newQQ/qq_data/index.txt"
csdnfile=open(csdnfilepath,"rb")
csdnindexfile=open(csdnindexfilepath,"rb")while True:searchstr=input("input searchstr")QQqunlist=search2(searchstr)#print(QQlist)for QQqun in QQqunlist:print(QQqun)csdnindexfile.close()
csdnfile.close()

QQ群数据的切割与归并(数据分析案例四)相关推荐

  1. 7000多万QQ群数据遭泄露 腾讯:确有其事已经修复

    安全漏洞监测平台乌云公布报告称,QQ群关系数据被泄露(凤凰科技配图) 原标题:7000多万个QQ群遭泄露腾讯:确有其事已经修复 腾讯公司回应,信息泄露确有其事,并已修复 国内知名安全漏洞监测平台乌云2 ...

  2. Excel数据分析案例四——留存预测

    Excel数据分析案例四--留存预测 题目:一个社交APP,它的新增用户次日留存率.七日留存率.30日留存率分别是52%.25%.14%,请模拟出如果每天新增6万用户量,那么第三十天,它的日活跃用户回 ...

  3. C# 获取QQ群数据的实现

    一,分析 1,群数据获取 当访问http://qun.qq.com/air/#mygroup我们通过Fiddler可以查看到QQ群列表是从http://qun.qq.com/air/group/min ...

  4. 用Python掌握QQ群聊天记录数据分析

    当你打开QQ群时,你是否想过如何用Python提取里面的数据呢?随着社交媒体的兴起,QQ群成为了人们交流的重要平台,而提取这些数据可以帮助我们了解用户喜好和行为.那么,如何使用Python提取QQ群数 ...

  5. qq群关系数据库 mysql_QQ群关系数据库24.52G mdf源文件下载 附上使用教程

    HQY 腾讯 7000W QQ群关系数据库泄漏共24.52G. QQ24.5gb腾讯QQ群关系数据库,不包含密码.只包含个人名字(群备注名字等信息). 如果想在线查询更多qq群数据信息可以查看: 一. ...

  6. qq群如何引流?QQ群如何精准引流?如何利用QQ群来引流?

    现在很多人说qq营销效果很差了,都转去微信营销去了,但我觉得这两个方向都没错.如果要说互联网上最直接有效,流量巨大的推广方法是什么,我觉得是QQ群,QQ群的引流相信大家是有目共睹的,如果你掌握了下面这 ...

  7. 大文件的切割与归并(数据分析案例三)

    本节内容的数据见电脑F:\python数据\Python海量数据(精缩版) 或 百度网盘"我的数据文件/Python海量数据" 本节内容基于大文件里面内容的快速查找的基础上延申 1 ...

  8. qq好友列表获取导出,利用QQ协议实现好友数据备份,包含:qq好友、QQ分组、QQ群、qq群成员【附code源码】

    qq好友列表获取导出,利用QQ协议实现qq好友数据备份,包含:qq好友.QQ分组.QQ群.qq群成员. 我们是在浏览器中的操作,接下来看看数据到底怎么获取的,我们通过Fiddler的查找功能,就可以查 ...

  9. R语言实战-如何分析QQ群记录1-格式化数据

    先对分析进行简单构思: 1.搜集并格式化数据 a.搜集QQ群记录-从QQ导出txt文档,筛选出需要统计的QQ群记录信息. b.导入QQ群记录信息,根据\n换行符读取每一行的信息. c.逐行读取,利用正 ...

最新文章

  1. Photoshop剪切板故障修复
  2. 设置IDEA中各种线条颜色
  3. [Android] 输入系统(三):加载按键映射
  4. Wait Event SQL*Net more data to client
  5. jsonpickle数据序列化
  6. java http请求原理_浅谈Spring Cloud zuul http请求转发原理
  7. php env 函数不存在,php-Laravel 5.2无法读取env fi
  8. authware链接html文件,authorware是什么软件?
  9. tekla钢结构算量_BIM钢结构造价怎么做?BIM如何用于钢结构工程量计算?
  10. 在JMP中拆分数据集有烦恼?这些实用妙招试试看!
  11. vue axios封装 类方法
  12. python 残差图_python 残差
  13. css数字怎么换行,css实现连续的英文或数字自动换行的方法
  14. Spring Boot系列——日志配置
  15. Padavan编译技巧
  16. 网页中有大量图片加载很慢,用什么方法进行优化
  17. 《『EcmaScript』之理顺Js中的四种继承
  18. centos系统简析
  19. 2019/2/3摄氏一华氏温度转换表
  20. 【前沿技术RPA】 一文了解UiPath 机器人企业框架 (REFramework)

热门文章

  1. 信息检索评价指标:正确率,召回率和F值
  2. 商标注册的材料和流程有哪些
  3. opencv 形态学操作(python)
  4. 雷达电子战的基本内容 (02)
  5. Java毕设项目智慧后勤系统计算机(附源码+系统+数据库+LW)
  6. 区块链每日快讯(0125)-明星项目影视链MDC涉嫌造假
  7. SDDCN架构下的DC内部负载均衡策略-ECMP
  8. 估值超60亿美元,GitHub 多年劲敌 GitLab 即将上市
  9. TiUP在线布署TIDB分布式数据库集群节点删除
  10. Huffman 编码 实验报告