主程序部分:
import re
import json
def preprocess(path,newfile):
'''接受一个txt聊天记录文件地址,处理后生成json文件'''
dialog=[]
pattern=r'([-\d]+)\s([:\d]+)\s(【.*】)?(.+)?(\(\d+\)|<.*>)\n?(.*)' #感觉可以了 后面格式化的时候清除一下就好
regex=re.compile(pattern=pattern)
with open(path,encoding='utf-8',errors='ignore') as f:
file=f.read()
data=re.split(pattern=r'\n{2,3}',string=file)[2:-1]
#data=str.split(file,'\n\n')[2:-1]#去除前两段无用内容和最后一个空字符
error=0
for i in data:
try:
date,time,nickname,name,ID,content=regex.findall(i)[0]
except Exception as e:
print(i,f'发生错误{e}')
error+=1
if not content:
continue #如果内容为空就跳过这轮循环,不存储空数据
dialog.append({
"date":date,
"time":time,
# "nickname":nickname.strip('[【】]'), 没有开启绰号,因为太多了耗费token而且没啥意义
"name":name,
"ID":ID.strip('[()]'),
"content":content,
})
js=json.dumps(dialog,ensure_ascii=0,indent=4)
open(newfile,'w').write(js)
print(f'格式化完成,发生了{error}次错误')
preprocess('幻想韵律-厦大幻想乡.txt','格式化聊天记录.json')
主要部分:
正则表达式:适配了可能出现的绰号,可能没有的名字以及可能是qq号或者邮箱
pattern=r'([-\d]+)\s([:\d]+)\s(【.*】)?(.+)?(\(\d+\)|<.*>)\n?(.*)'
对原聊天记录文件进行分离,因为qq聊天记录是用两个换行符来分割不同聊天记录的,这里还去除了前两行的无用信息和最后一个空字符串
data=re.split(pattern=r'\n{2,3}',string=file)[2:-1]
目前问题:
1. 如何处理内容本身有连续两个换行符或多个
后续改进方向:
1. 分离消息头和消息内容
2. 遍历每一行,一旦发现符合消息头格式,就认为是开头,开始读取信息
3. 不断将一行归为信息集,直到发现下一个消息头
4. 将上面的消息头和信息集正则处理后写入json