利用正则表达式解析qq聊天记录为json文件(最终版)

修正了因为行内存在换行符而无法读取的问题

增加内容

1. 可以选择是否存储最新的群昵称(因为群昵称可能会有变动)

2. 可以选择是否存储称号

from tqdm import tqdm
import re
import json

def extract_dialog(path):
    def flush():
        if content: #不保存空白消息
            dialogs.append({
                'date':date,
                'time':time,
                # 'nickname':nickname.strip('[【】]'),
                'name':name,
                'ID':ID.strip('[()<>]'),
                'content':content
            })

    def update_name_map():
        name_map[ID.strip('[()<>]')]=name #只保存最新名字,可以改成保存多个时间段的名字

    def map_name():
        '''将dialog的name替换成最新名字'''
        for dialog in dialogs:
            dialog['name']=name_map[dialog['ID']] #根据当前ID替换名字

    name_map={} #格式为id:名字,只存最新的
    dialogs=[] #准备存入json格式的
    first_flag=0
    pattern=r"(\d{4}-\d{2}-\d{2}) (\d{1,2}:\d{2}:\d{2}) (【.*】)?(.+)?(\(\d+\)|<.*>)" #分别匹配日期、时间、称号、名字、邮箱或qq号
    compiled=re.compile(pattern=pattern)

    with open(path,mode='r',encoding='utf-8') as f:
        lines=f.readlines()
        lines.append('EOF1145141919810')
        for line in tqdm(lines):
            head_match=compiled.findall(line)
            if head_match:#如果检测到是行头,就把上一次的内容刷新进去
                if first_flag: #第一次不刷新
                    flush()
                    update_name_map()
                first_flag=1
                date,time,nickname,name,ID=head_match[0] 
                content=''
            else: #若不是行头,就是最前面的内容或者用户输入内容
                if first_flag: 
                    if line.strip(): #如果不是空行
                        if line=='EOF1145141919810': #如果到达结尾,因为没有下次行头了,立即刷新
                            flush()
                        else:
                            content+=line.strip()
    map_name() #替换名字,可以去除
    
    js=json.dumps(dialogs,ensure_ascii=0,indent=4)
    try:
        open('extracted_dialog.json','x').write(js) #不存在文件会被自动创建,存在会报错
    except:
        flag=input('该文件已经存在,是否要覆盖?是则输入1,否则输入0')
        if flag:
            open('extracted_dialog.json','w').write(js)
    print(f'成功完成转换!一共{len(dialogs)}条消息')

PATH='你的聊天记录'
extract_dialog(PATH)                

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值