之前,寫了這篇文章,用python提取全部群成員的發言時間,並簡單做了下分析。先補充一下,針對特定單個群成員(這里以 小小白 為例)消息記錄的獲取。
代碼比較簡單,主要是正則表達式的書寫。(附:聊天文件記錄的導出請參考上面提到的文章)
代碼如下:
#2016/9/14 #從QQ聊天數據導出特定人發言的日期時間和發言內容 import re import xlsxwriter # 小小白 這里代指你要獲取數據的對象的昵稱 # 方便起見,見數據導出的文件名也明明為此 workbook = xlsxwriter.Workbook('小小白.xlsx') worksheet = workbook.add_worksheet() worksheet.set_column('A:A', 5) worksheet.set_column('B:B', 10) worksheet.set_column('C:C', 200) with open('高等數學.txt',encoding='utf-8') as f: s = f.read() # 正則,跨行匹配 pa = re.compile(r'^(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2}) 小小白\(小小白的QQ號\)\n(.*?)\n$',re.DOTALL+re.MULTILINE) ma = re.findall(pa,s) # print(len(ma)) for i in range(len(ma)): # print(ma[i][0]) date = ma[i][0] time = ma[i][1] word = ma[i][2] worksheet.write(int(i),0,date) worksheet.write(int(i),1,time) worksheet.write(int(i),2,word) workbook.close() print("處理完畢,快去看看文件夾下面新建的.xlsx文件吧")
###########2016/10/18補更###############
小島台風,待在宿舍無聊,就優化了之前分析QQ聊天記錄的代碼,綜合上文和之前寫的那篇文章,做了個私人訂制。實現從聊天記錄對特定人的發言信息進行提取,並用matplotlib作圖,終於不想用excel...
代碼比較簡單,核心的提取都和之前的一樣,這里直接貼出來:
import re import matplotlib.pyplot as plt # 解決matplotlib顯示中文的問題 import matplotlib as mpl mpl.rcParams["font.sans-serif"] = ["Microsoft YaHei"] mpl.rcParams['axes.unicode_minus'] = False # 獲取24個時間段----->periods # 用於之后時間的分段 def get_periods(): periods = [] for i in range(0,24): # 這里的判斷用於將類似的‘8’ 轉化為 ‘08’ 便於和導出數據匹配 if i < 10: i = '0'+str(i) else: i = str(i) periods.append(i) return periods ''' 對QQ群而言的時間提取 # 獲取聊天文件的“小時”數據 def get_times(filename): with open(filename, encoding='utf-8') as f: data = f.read() # 例如20:50:52,要匹配其中的20 pa = re.compile(r"(\d\d):\d\d:\d\d") times = re.findall(pa, data) return times ''' # 對每一個時間段進行計數 def classification(times,period): num = 0 for time in times: if time == period: num += 1 period_time.append([period,num]) # print(period, '--->', num) # 作圖 def plot_time(period_time,name): time = [] num = [] for i in period_time: time.append(i[0]) num.append(i[1]) time = time[6:24]+time[0:6] num = num[6:24]+num[0:6] # print(time,'\n',num) labels = time x = [i for i in range(0,24)] plt.plot(num, 'g') num_max = max(num) plt.xticks(x,labels) plt.axis([00, 24, 0, num_max*(1.2)]) plt.grid(True) plt.title(name) plt.ylabel('發言量') plt.xlabel('時間') plt.show() def get_person_data(filename,name,qqnumber): person_data = {'date':[],'time':[],'word':[]} with open(filename,encoding='utf-8') as f: s = f.read() # 正則,跨行匹配 pa = re.compile(r'^(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2}) '+name+r'\('+qqnumber+'\)\n(.*?)\n$',re.DOTALL+re.MULTILINE) ma = re.findall(pa,s) # print(len(ma)) for i in range(len(ma)): # print(ma[i][0]) date = ma[i][0] time = ma[i][1] word = ma[i][2] person_data['date'].append(date) person_data['time'].append(time[0:2]) person_data['word'].append(word) return person_data if __name__=="__main__": filename = input('請輸入聊天記錄文件名:') name = input('准備提取個人信息就緒,請輸入要提取人的群名片:') qqnumber = input('請輸入要提取人的QQ號:') period_time = [] person_data = get_person_data(filename,name,qqnumber) times = person_data['time'] periods = get_periods() for period in periods: classification(times,period) plot_time(period_time,name) # print(person_data['word'])
關於matplotlib作圖指定坐標標簽的,看這里。
運行結果如下: