之前,寫了這篇文章,用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作圖指定坐標標簽的,看這里。
運行結果如下:

