导出QQ聊天记录并用python处理

时间:2024-02-23 10:17:19

今天和天天弟弟聊天,很有感慨,想把聊天记录保存下来(QQ),教程如下。

STEP1  从QQ里导出聊天记录

有两个方法导出:(1)打开聊天窗口中的“聊天记录”,右下角是消息管理器,打开,在想要保存记录的群/好友图标上右键→导出。

                             (2)打开扣扣主面板,点击设置→消息管理器,后面的步骤同上。

注意,可以保存成.bak和.txt,我主要是用txt文件。

STEP2  使用python进行处理

直接导出的txt文本是这样的:

看着有点累,我更喜欢这种简介明了的对话形式:

A:...................

B:...................

那么,就处理吧。代码如下:

 1 pathr=r"C:\Users\Lenovo\Desktop\20200507.txt"
 2 fr=open(pathr,\'r\',encoding=\'utf-8\')#txt编码类型可以在notepad中查看
 3 fw=open("C:\\Users\\Lenovo\\Desktop\\process20200507.txt",\'a\')
 4 flag=-1#0是天天,1是冬冬,2是表情包hhhh
 5 for line in fr:#不要忘记冒号
 6     if line.isspace()==True:#如果一行只有表情,导成txt只显示一个空行
 7         continue#直接读下一行
 8     if ("2020" in line) and ("天天" in line):#天天说的话
 9         flag=0 
10         continue
11     elif ("2020" in line) and ("冬冬" in line):#我说的话
12         flag=1
13         continue
14     elif ("[图片]" in line):#单发了一个表情包
15         flag=2
16         continue
17     if flag==0:
18         fw.write("天天:"+line+"\n")
19         flag=-1
20     elif flag==1:
21         fw.write("冬冬:"+line+"\n")
22         flag=-1
23 fr.close()#不要忘记关闭文件
24 fw.close()

是不是觉得分支很多,还用了flag辅助QAQ

emm...其实如果用readline()就没有这个问题,当前行如果是“2020-5-7xxxxx冬冬”(说话人信息),那就直接再用readline()去读下一行。但我的spyder和pycharm由于安装不当,使用时存在许多问题,readline()无法直接使用,需要import一下,但在命令行pip install readline,又频频失败。我早就体会过pip失败后修复的困难了,所以再尝试二三后,果断放弃使用这个函数。百度一番,读取文件的一行还可以直接for line in……(这种简单的文件操作还要百度一下,可见我真的不太用心,记不住啊!!)。

使用readline()的代码是这样的:(没跑通,不知道有没有小问题,而且没处理行为空的情况)

 1 fr=open("C:\\Users\\Lenovo\\Desktop\\20200507.txt",\'r\',encoding=\'utf-8\')
 2 fw=open("C:\\Users\\Lenovo\\Desktop\\process20200507.txt",\'a\')
 3 while(1):
 4     line=fr.readline()
 5     if ("2020" in line) and ("天天" in line):
 6         line=readline();
 7         fw.write("天天:"+line+"\n")
 8     elif ("2020" in line) and ("冬冬" in line):
 9         line=readline();
10         fw.write("冬冬:"+line+"\n")
11 fp.close()
12 fw.close()

 处理后的聊天记录文件是这样的,清爽多了:

 

-----------------------------------------------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------------------------------------------

以下记录一下这短短的代码编写中遇到的问题和查到的一些东西:(其实以前全都接触过,只是我一直没用心记,所以逼着自己写下来)

  • Python文件读写操作
f=open("xxx.txt","a+")

#若干操作
cdy="hhh"
f.write("JLU"+cdy+"\n")

f.close()

读写模式

模式可做操作若文件不存在是否覆盖指针位置
r 只能读 报错 - 0
r+ 可读可写 报错 0
w 只能写 创建 0
w+ 可写可读 创建 0
a 只能写 创建 否,追加写 最后
a+ 可读可写 创建 否,追加写 最后

路径:

参考:https://blog.csdn.net/weixin_41811657/article/details/85158003

python读文件需要输入的目录参数,列出以下例子:

path = r"C:\Windows\temp\readme.txt"

path1 = r"c:\windows\temp\readme.txt"

path2 = "c:\\windows\\temp\\readme.txt"

path3 = "c:/windows/temp/readme.txt"

打开文件函数open()中的参数可以是path也可以是path1、path2、path3。

path:"\"为字符串中的特殊字符,加上r后变为原始字符串,则不会对字符串中的"\t"、"\r" 进行字符串转义

path1:大小写不影响windows定位到文件

path2:用一个"\"取消第二个"\"的特殊转义作用,即为"\\"

path3:用正斜杠做目录分隔符也可以转到对应目录,并且在python中path3的方式也省去了反斜杠\转义的烦恼

 

按行读取文件:

参考:https://www.cnblogs.com/aiyue443/p/9774932.html

(1)通过readline()来进行读取

f = open(\'xxx/xxx/1.tcl\')

line = f.readline()

但是这个只是读取文件的第一行。如何循环使用呢?

while line:

  print line,   #后面跟,表示忽略换行符。

  line = f.readline()  # 继续读取下一行

f.close()

(2)  第二种方法

for line in open(\'xxx/xx/1.tcl\'):

  print line

 

一些报错:

 

1 SyntaxError: invalid syntax
  • 忘记在 if , elif , else , for , while , class ,def 声明末尾添加 冒号( : );
  • 误将 = 当成 == 使用;
  • 错误的缩进
2

UnicodeDecodeError: \'gbk\' codec can\'t decode byte 0xbf in position 2: illegal multibyte sequence

  •  用notepad打开txt文件,把编码格式改成utf-8,再在open()里加上对应的encoding参数
     fr=open(pathr,\'r\',encoding=\'utf-8\')
  • python是 外部文件编码->内部编码->目标编码,这个报错的意思,是当内部编码转化成 gbk编码(默认)时出错