告别手动整理!用这个开源工具一键转换QQ聊天记录为结构化数据
告别手动整理用这个开源工具一键转换QQ聊天记录为结构化数据你是否也曾对着导出的QQ聊天记录.txt文件发愁那些密密麻麻的文字夹杂着时间戳、昵称、表情符号和系统消息想要从中提取出有意义的对话用于个人分析、情感回顾甚至作为AI模型训练的语料简直是一项浩大的工程。手动筛选、清洗、格式化不仅耗时费力还容易出错。对于非技术背景的用户来说这更是一道难以逾越的技术鸿沟。今天我将分享一个我为了解决这个痛点而开发的开源桌面工具。它完全免费拥有图形化界面只需点击几下鼠标就能将杂乱的QQ聊天记录自动转换成清晰、结构化的JSONL格式数据。无论你是想为自己的数字生活做个备份分析还是希望用真实的对话数据来微调一个个性化的语言模型这个工具都能让你告别繁琐的手动操作把精力真正聚焦在数据本身的价值上。1. 为什么我们需要一个聊天记录转换工具在数字时代我们的聊天记录承载了大量的个人信息、社交关系和知识片段。无论是与家人的温馨对话、与朋友的深度交流还是工作群里的项目讨论这些文本数据都蕴含着独特的价值。然而QQ导出的原始数据格式却像一座未经雕琢的矿山直接使用的难度极高。原始数据面临的典型挑战结构混杂一条记录混合了日期、时间、昵称、消息内容且格式固定但非结构化。噪音干扰充斥着[图片]、[表情]、撤回了一条消息、[自动回复]等对语义分析无用的系统消息。身份识别模糊聊天中“我”的昵称可能随着时间改变对方的备注也可能不同需要准确区分对话双方。上下文割裂连续的多条消息可能属于同一语义单元需要合理合并而长时间间隔的对话则应视为不同话题进行分割。格式要求严格下游应用如AI训练通常需要特定的结构化格式如每轮对话以{role: user/assistant, content: ...}的JSON对象排列。手动处理这些问题的成本是惊人的。因此一个能够自动化完成解析、清洗、去噪、合并、分割、格式化全流程的工具就显得尤为必要。它不仅提升了效率更重要的是保证了处理过程的一致性和准确性让非技术用户也能轻松驾驭自己的数据。2. 工具核心设计如何让机器理解聊天记录在动手编码之前我们需要让程序理解QQ聊天记录.txt文件的“语言规则”。这就像教一个孩子阅读一本特定格式的日记。基于对大量导出文件的分析我总结出了以下核心规则并据此设计了处理逻辑。2.1 解析原始数据的“语法”一个典型的QQ聊天记录TXT文件结构如下消息对象:张三 2023-10-27 14:30:15 我的昵称A 吃午饭了吗 2023-10-27 14:31:02 张三 刚吃完你呢 2023-10-27 14:31:20 我的昵称A 我也刚吃完。[图片] 2023-10-27 14:32:00 张三 [表情]下午开会别忘了。其核心规则可以归纳为一张表元素规则与示例处理逻辑文件头首行固定为消息对象:后接对方昵称/备注。用于识别本次对话的参与者但“我”的昵称需从后续消息中提取。消息块以YYYY-MM-DD HH:MM:SS 昵称格式的时间戳行开始。这是识别单条消息的起始标志。消息内容时间戳行之后直到下一个时间戳行或文件结尾前的所有行。可能包含换行需要合并为一个字符串。“我”的昵称在消息块的时间戳后出现且不等于“消息对象”中的名字。是动态的可能在不同时期、不同对话中发生变化需要集合来识别。无效内容[图片]、[表情]、撤回了一条消息、[自动回复]等。需要过滤或进行无害化替换如将[图片]替换为逗号。注意系统消息如“对方已成功接收了你发送的离线文件”没有昵称字段只有时间戳这类消息需要被过滤掉。基于这套“语法”工具的首要任务就是逐行读取文件准确地将非结构化的文本流切割成一条条包含时间、说话人、内容的独立消息对象。2.2 构建智能的清洗与转换流水线识别出单条消息只是第一步。接下来我们需要一个流水线对这些消息进行深加工使其成为高质量的结构化数据。整个核心转换流程我将其设计为一个状态机循环初始化跳过文件头找到第一条有效消息作为起始状态 (last_msg)。循环读取读取下一条消息 (cur_msg)。有效性校验检查cur_msg是否为空文件结束或为无效消息纯系统消息、纯表情等。无效则跳过回到步骤2。话题分割判断计算cur_msg与last_msg的时间差。如果超过预设阈值例如6小时则认为开启了新话题。将之前累积的对话写入文件并清空缓存。说话人合并判断如果cur_msg与last_msg的说话人相同则将两条消息内容合并更新时间戳为cur_msg的时间视为同一次发言的延续。对话轮次构建如果cur_msg与last_msg的说话人不同则将last_msg存入本轮对话的缓存列表。这代表了一轮完整的“一问一答”或“一说一应”中的前者。状态更新将cur_msg赋值给last_msg成为下一轮比较的基准。写入与循环当缓存列表中的消息积累到一定程度通常是成对出现或遇到话题分割、文件结束时将缓存中的消息按规则格式化为user/assistant交替的对话轮次写入JSONL文件。这个流程的精妙之处在于它仅依靠时间间隔和说话人切换这两个最显著的信号就实现了对连续对话的合理切分与合并模拟了人类理解对话片段的方式。# 核心转换逻辑的简化伪代码示意 def process_messages(file): last_msg get_first_valid_msg(file) conversation_buffer [] while True: cur_msg read_next_message(file) if cur_msg is None: # 文件结束 write_buffer_to_file(conversation_buffer) break if not is_valid(cur_msg): continue # 判断话题是否切换 if time_gap(last_msg, cur_msg) THRESHOLD: write_buffer_to_file(conversation_buffer) conversation_buffer [] # 判断是否为同一人连续发言 if cur_msg.speaker last_msg.speaker: merged_msg merge_messages(last_msg, cur_msg) cur_msg merged_msg else: conversation_buffer.append(last_msg) last_msg cur_msg # 当缓冲区有足够轮次对话时可以写入 if ready_to_write(conversation_buffer): write_buffer_to_file(conversation_buffer) conversation_buffer [] # 清空或部分清空3. 从零构建工具的技术实现拆解为了让这个工具真正“开箱即用”我选择了Python PyQt5的组合。Python负责核心的数据处理逻辑而PyQt5则用来构建一个对用户友好的图形界面。整个项目结构清晰分为四个主要模块。3.1 核心引擎数据处理模块这是工具的“大脑”位于handlingRecords.py中。它严格实现了上一节描述的转换流水线。其中最关键的函数是read_chattingRecord它负责消化一个TXT文件并输出结构化的对话。几个关键的技术细节处理昵称动态识别read_message函数在读取每条消息时会判断消息中的昵称是否存在于全局的“我的昵称集合”(MYNAME)中。如果在则将其角色标记为“我”否则标记为“对方”。这解决了用户昵称可变的问题。无效内容过滤is_valid_MSG函数定义了一个无效内容集合用于过滤掉无意义的系统通知和纯媒体标记。内容清洗在写入JSONL前会使用正则表达式对内容进行最后清洗例如将连续的标点符号如“”合并为单个使文本更整洁。# 消息有效性判断函数示例 def is_valid_MSG(msg): 判断一条消息是否有效非系统消息、非纯表情等 invalid_keywords { [自动回复], 撤回了一条消息, 对方已成功接收了你发送的离线文件, [戳一戳], # ... 其他无效模式 } # 检查消息角色是否存在 has_valid_role bool(msg.role) # 检查是否包含无效关键词 has_no_invalid_content not any(word in msg.message for word in invalid_keywords) # 检查去除标点后是否为空过滤纯表情/图片 import re cleaned_content re.sub(r[。,.;;!?], , msg.message).strip() has_real_content bool(cleaned_content) return has_valid_role and has_no_invalid_content and has_real_content3.2 智能预处理昵称集合自动提取“我的昵称集合”是区分对话双方的关键。gettingNameset.py模块的职责就是自动化地完成初步提取。它遍历用户选定的文件夹中的所有TXT文件统计所有出现在消息发送者位置、且不是“消息对象”即对方的昵称。其工作流程如下读取一个文件定位“消息对象”对方昵称。遍历所有消息收集发送者昵称。过滤掉与“消息对象”相同或包含“消息对象”的昵称这很可能是对方昵称的变体。统计所有剩余昵称的出现频率。合并所有文件的结果得到一个“候选昵称集合”。这个集合可能包含用户历史上用过的所有昵称也可能混入一些特殊的系统昵称或误判。因此它需要交给用户在图形界面中进行最终确认和筛选。3.3 用户交互界面PyQt5构建的GUImain_ui.py是用户看到并与之交互的部分。使用PyQt5构建界面简洁直观主要包含以下几个区域目录选择框和按钮让用户定位存放了所有QQ聊天记录TXT文件的文件夹。候选昵称列表以醒目方式展示自动提取出的“候选昵称集合”。每个昵称旁边都有一个红色的“X”按钮用户可以点击删除那些不属于自己的昵称比如误入的系统消息名称或他人的昵称。“训练自己”复选框这是一个重要的选项。勾选时最终生成的对话中“我”的发言将始终对应role: user对方的发言对应role: assistant。这适用于训练一个模仿自己说话风格的AI。如果不勾选则角色分配取决于对话的发起方适用于分析对话模式或训练以对方为目标的模型。转换按钮在所有配置完成后一键启动转换过程。界面的逻辑流与用户操作流完美匹配用户选择文件夹 - 程序自动扫描并展示候选昵称。用户清理昵称列表 - 程序更新内部的昵称集合。用户选择“训练自己”选项 - 程序设定角色分配规则。用户点击转换 - 程序调用核心引擎处理所有TXT文件并在原文件夹内生成一个[文件夹名].jsonl的结果文件。3.4 共享与部署打包成可执行文件为了让完全没有Python环境的Windows用户也能使用我们需要将整个项目打包成一个独立的.exe文件。这里使用PyInstaller工具它可以将Python解释器、依赖库和你的脚本一起打包。# 在项目目录下执行打包命令 pyinstaller --onefile --windowed --name QQ聊天记录转换器 main_ui.py--onefile将所有内容打包进单个exe文件分发方便。--windowed运行时不显示命令行黑框是纯图形界面程序。--name指定生成exe文件的名称。打包完成后你会得到一个名为QQ聊天记录转换器.exe的文件。双击即可运行用户无需安装Python或任何库真正实现了“开箱即用”。4. 实战指南一步步完成你的第一次转换理论说得再多不如亲手操作一遍。让我们从头开始完成一次完整的聊天记录转换。4.1 第一步从QQ导出原始数据目前最可靠的方式是使用PC版QQ的“消息管理器”功能。打开PC版QQ在主面板左下角找到消息管理器图标像一个时钟或对话气泡。在消息管理器左侧列表中找到你想要导出的好友或群聊右键点击。选择“导出消息记录”。在保存对话框中选择保存类型为“文本文件(*.txt)”并为其选择一个容易找到的文件夹。建议为每次导出的对话单独建立一个文件夹方便后续工具批量处理。重复以上步骤导出所有你需要处理的聊天记录将它们放在同一个文件夹内。提示导出的TXT文件命名通常包含QQ号和日期你可以为了管理方便将其重命名为更易识别的名字如“与张三的聊天记录.txt”工具只认.txt后缀。4.2 第二步运行工具并配置获取工具从项目的发布页面下载打包好的QQ聊天记录转换器.exe文件。首次运行双击exe文件启动工具。界面加载后你会看到目录输入框、“选择目录”按钮、一个空白的昵称展示区、一个复选框和一个“确认开始转换”按钮。选择文件夹点击“选择目录”按钮在弹出的文件浏览器中定位到你存放了所有TXT聊天记录文件的文件夹点击“确定”。审查昵称工具会自动扫描文件夹内所有TXT文件并将其识别出的“候选昵称”展示在列表中。这一步至关重要。你需要仔细查看这个列表点击每个不属于你的昵称旁边的红色“X”将其删除。只留下所有历史上属于“你”的QQ昵称。如果列表为空或提示未识别到数据请检查TXT文件格式是否正确。选择模式根据你的用途决定是否勾选“训练自己”。勾选适用于你想用自己说过的话来训练一个AI助手。最终数据中“你”永远是user对方永远是assistant。不勾选适用于你想分析对话模式或者用对方的语料进行训练。角色分配将按照对话的实际顺序交替。4.3 第三步执行转换与结果验收确认昵称列表准确无误且模式选择正确后点击“确认开始转换”按钮。程序开始工作界面可能会短暂无响应处理大量数据时这是正常的。处理完成后会在界面底部显示“转化完成文件保存到 [路径]”的提示。打开你之前选择的那个文件夹你会发现多了一个新的文件文件名与文件夹名相同后缀为.jsonl例如我的聊天记录.jsonl。如何验证结果你可以用任何文本编辑器如VS Code、Notepad打开这个.jsonl文件。它的内容应该是这样的{conversations: [{role: user, content: 吃午饭了吗}, {role: assistant, content: 刚吃完你呢}]} {conversations: [{role: user, content: 我也刚吃完。}, {role: assistant, content: 下午开会别忘了。}]}每一行都是一个独立的JSON对象代表一轮完整的对话。user和assistant角色清晰无关的系统消息、纯表情已被过滤连续的发言已被合并。这份干净、结构化的数据已经可以直接用于许多数据分析平台或AI模型训练框架如ChatGLM、LLaMA-Factory等支持的微调数据格式。5. 进阶应用与个性化调整工具提供了基础且稳健的转换功能但如果你有特殊需求或者想将其集成到自己的数据流水线中直接使用源码并进行修改是更好的选择。5.1 调整话题分割的敏感度在handlingRecords.py的read_chattingRecord函数中控制话题分割的关键参数是时间间隔阈值。默认设置为6小时6*3600秒。if abs((cur_msg.time - last_msg.time).total_seconds()) 6*3600: # 时间间隔超过6小时视为新话题 # ... 写入缓存并清空你可以根据你的聊天习惯修改这个值对于非常密集的群聊可以缩短到1*36001小时甚至更短。对于间隔很长的私聊可以延长到24*36001天。 修改后重新运行脚本或打包即可。5.2 自定义清洗规则无效内容的过滤规则定义在global_func_and_v.py的is_valid_MSG函数和invalid_set中。如果你发现某些特定的系统消息如新版本的QQ新增了某种提示没有被过滤可以将其关键词添加到这个集合中。invalid_set set([ [自动回复], 对方已成功接收了你发送的离线文件, 撤回了一条消息, 给你发送了一个窗口抖动。, [戳一戳], # 你可以在这里添加新的需要过滤的关键词例如 # 拍了拍你, # [语音], ])同样对于[图片]、[表情]的替换规则可以在read_message函数中找到对应的正则表达式re.sub(r\[图片\]|\[表情\], ,, ...)你可以修改替换符或者选择直接将其替换为空字符串。5.3 输出格式的扩展目前工具固定输出为特定的JSONL格式以适配主流AI训练框架。如果你的下游应用需要其他格式比如CSV、纯文本对话格式或者需要保留更多元数据如精确时间戳你需要修改new_write_json函数。例如如果你想输出为CSV格式可以重写这个函数import csv def write_to_csv(filename, content_list): with open(filename, a, newline, encodingutf-8) as csvfile: writer csv.writer(csvfile) for role, content in content_list: writer.writerow([role, content])然后在主流程中调用这个新的写入函数即可。这种模块化的设计使得核心的解析、清洗逻辑可以复用只需调整输出模块就能满足多样化的需求。整个项目代码结构清晰注释完整即便你是Python初学者按照模块的划分去理解和修改也并非难事。从一键使用的傻瓜式工具到可根据需求深度定制的数据处理脚本这个开源项目为你提供了完整的自由度。

相关新闻

ZLMediaKit重封装性能优化实战:如何用RingBuffer实现零拷贝转发?

ZLMediaKit重封装性能优化实战:如何用RingBuffer实现零拷贝转发?

ZLMediaKit重封装性能优化实战:如何用RingBuffer实现零拷贝转发? 如果你在流媒体服务器开发中遇到过这样的场景:推流一路1080p的H.264视频,同时有上百个客户端通过RTSP、RTMP、HTTP-FLV等不同协议拉流观看,服务器CPU占…

2026/7/4 15:37:25 阅读更多 →
AT指令开发避坑指南:如何用表驱动法优雅处理模块主动上报的URC数据

AT指令开发避坑指南:如何用表驱动法优雅处理模块主动上报的URC数据

AT指令开发避坑指南:如何用表驱动法优雅处理模块主动上报的URC数据 刚接触NB-IoT或LoRa这类通讯模组开发的工程师,常常会陷入一个看似简单却暗藏玄机的泥潭:如何处理那些不请自来的数据。你精心发送了一条AT指令,等待一个明确的“…

2026/7/5 13:06:35 阅读更多 →
告别卡米!安全使用Magisk实现安卓开机自启动的5个关键注意事项

告别卡米!安全使用Magisk实现安卓开机自启动的5个关键注意事项

告别卡米!安全使用Magisk实现安卓开机自启动的5个关键注意事项 在安卓设备上实现可靠的开机自启动,对于自动化运维、设备管理、安全研究乃至个人定制化需求来说,都是一个颇具吸引力的目标。尤其是当你需要设备一启动就执行特定的Shell脚本、启…

2026/7/6 7:12:21 阅读更多 →

最新新闻

3分钟搞定Calibre图书信息自动化:国家图书馆ISBN插件终极指南

3分钟搞定Calibre图书信息自动化:国家图书馆ISBN插件终极指南

3分钟搞定Calibre图书信息自动化:国家图书馆ISBN插件终极指南 【免费下载链接】NLCISBNPlugin 基于中国国家图书馆ISBN检索的calibre的source/metadata插件。https://doiiars.com/article/NLCISBNPlugin 项目地址: https://gitcode.com/gh_mirrors/nl/NLCISBNPlug…

2026/7/7 5:55:39 阅读更多 →
小草助手口令野草助手

小草助手口令野草助手

小草助手口令野草助手

2026/7/7 5:55:39 阅读更多 →
企业试用期合同管理的8个高频雷区与合规操作手册

企业试用期合同管理的8个高频雷区与合规操作手册

试用期是企业和员工互相了解的"缓冲期",但这个缓冲期同时也是劳动争议的高发区。很多企业管理者和HR误以为试用期是企业说了算的"观察期",可以随便定规则、随便辞人,却不知道试用期恰恰是劳动法律监管最严格的阶段之一。…

2026/7/7 5:55:39 阅读更多 →
行业科普:互联网全媒体广告代理的市场空间与盈利逻辑

行业科普:互联网全媒体广告代理的市场空间与盈利逻辑

一、市场刚需与行业基本面线上广告是数字营销体系的核心组成部分,如今已成为绝大多数企业的常规经营支出。从市场现状来看,规模不等的商家通常会按月度或季度制定广告投放预算,业务范围可覆盖全国市场,需求的普遍性支撑起了庞大的…

2026/7/7 5:53:39 阅读更多 →
FTC 框架详解:残差 RL、稠密奖励与人在环的真实世界机器人训练

FTC 框架详解:残差 RL、稠密奖励与人在环的真实世界机器人训练

FTC 框架详解:残差 RL、稠密奖励与人在环的真实世界机器人训练 先说结论FTC 通过残差 RL 将探索起点锁定在目标区域附近,大幅降低真实世界交互次数需求。基于关键帧的可供性稠密奖励比 VLM 推理更轻量、实时,但依赖示教数据质量。人类干预窗口…

2026/7/7 5:51:39 阅读更多 →
Gin 架构在区块链应用中的最佳实践

Gin 架构在区块链应用中的最佳实践

1. 引言 在区块链技术快速发展的今天,如何构建高性能、可维护且安全的去中心化应用(DApp)后端服务成为开发者面临的关键挑战。Gin 是一个用 Go 语言编写的高性能 Web 框架,以其简洁的 API、出色的路由性能和中间件生态而闻名。本文…

2026/7/7 5:51:39 阅读更多 →

日新闻

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

图片浏览是移动应用中最高频的场景之一。从社交应用的照片流到电商平台的商品图集,从旅游应用的景点相册到摄影作品展示——用户对图片浏览的体验要求不断提高:流畅的切换动画、直观的缩略图导航、便捷的收藏操作、自动播放模式。HarmonyOS NEXT ArkUI 虽…

2026/7/7 0:05:16 阅读更多 →
24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V稳压芯片完整选型指南 PW8600 PW75XX PW2815 PW2312B LDODC/DC全方案 一、24V稳压方案概述 24V直流电源在工业自动化、门禁系统、电梯控制、汽车电子、LED驱动、监控设备等场景中应用极广,是最常见的中压直流母线电压。要将24V母线稳定降压至下游MCU、传感器…

2026/7/7 0:05:16 阅读更多 →
RAG+知识图谱混合检索与Graph RAG核心对比

RAG+知识图谱混合检索与Graph RAG核心对比

做企业RAG落地的团队,往往容易卡在一容易踩坑的选型难题: 当需求单纯靠向量RAG搞不定、单纯靠知识图谱也搞不定,必须同时依赖「文本语义理解 实体关系推理」时,到底是做「向量图谱混合检索」就够了,还是必须上「Grap…

2026/7/7 0:07:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻