
这个工具解决什么问题
换一次手机,通讯录就要收拾一次。旧手机导出一份 .vcf,新手机导出一份,再加上电脑上那份云同步留下的备份——三个文件一合并,通讯录里「张三」出现了三次、「陈静」出现了两次,有的条目带着手机号没有邮箱,有的正好反过来。想手动合并,就得在几十上百条里来回翻,找到同一个人,把两条的字段拼到一起,再删掉多余的那条。更麻烦的是号码写法不统一:同一个号,一份文件里是 13812345678,另一份是 +86 138 1234 5678,还有一份是 008613812345678,肉眼看得出是一个人,靠排序却怎么也排不到一起。这个工具就是把这件事交给程序做:读入多个 .vcf,按号码把同一个人归到一组,字段取并集,最后输出一份干净的通讯录。
- 原来的做法:在手机的通讯录 APP 里逐条对比、逐条删除;或者先把两个 .vcf 都导入电脑版通讯录,再用「查找重复项」一个个确认合并(每条都要点一下,几十条就是几十次点击)
- 用这个工具:把几个 .vcf 拖到程序图标上(或在窗口里多选),程序自动按归一号码找出重复组,表格里一眼看到哪几组是多条合成的,双击能核对原始名片,确认无误后一次导出
- 省下来的:一次合并 10 个文件的重复项,从半小时的逐条核对变成点两下;关键是号码写法不同(+86、0086、带空格横线)也能认成同一个人
技术实现
整件事拆成两层:vcard_core.py 只管「把文件变成人」,contact_gui.py 只管「把结果摆到窗口里」,中间靠一个 MergeResult 对象传递。这么拆的原因是通讯录文件太脏——同一份通讯录,苹果导出的是 UTF-8 的 3.0、老安卓导出的是 GBK + QUOTED-PRINTABLE 的 2.1、还有些设备会把中文名折成两行。这些坑全在解析层,必须能脱离界面反复测试;界面层只承担交互,出问题时能立刻判断是哪一层的事。去重用的是并查集而不是简单字典:一个人可能有三张卡片,A 与 B 同手机号、B 与 C 同邮箱,A 和 C 毫无交集,只有连通分量能把三张收进一组。
- 编码判定按 BOM → UTF-8 → GB18030 的顺序试:先看 UTF-8/UTF-16 的 BOM,没有再严格试 UTF-8,失败才退到 gb18030,最后才是容错解码。顺序不能反过来:gb18030 几乎不会解码失败,放前面会把 Big5 文件也「成功」解成乱码,而且不会报错,用户只会看到一堆问号。
- 行折叠先拼 QUOTED-PRINTABLE 软换行,再拼空格续行:标准行折叠(RFC 6350)的续行以单个空格或 TAB 开头,但 QUOTED-PRINTABLE 的续行是「行尾一个等号 + 直接换行」,不以空格开头。先按空格拼会把 QP 数据切断、解出乱码,所以顺序是 QP 软换行优先。判断依据只看当前属性头里有没有 QUOTED-PRINTABLE,避免把 NOTE 里合法的行尾等号误当软换行。
- 号码归一化只用于比较,不改用户看到的写法:内部键做四件事:全角转半角、去掉空格横线括号、00 前缀转国际、大陆手机号补 86。于是 13812345678 / +8613812345678 / 008613812345678 得到同一个键。写回文件时用的是原始写法(取第一次出现的那个),因为用户手机里存的就是他习惯的样子;位数不足 6 位的一律不参与比较(分机号、短号拿去比极易误伤)。
- 并查集求连通分量,代替两两比较:按号码和姓名建倒排桶,只在桶内两两判定,再用带路径压缩的并查集合并。10000 条通讯录不需要 5000 万次比较;同时天然处理传递性——A~B 同号、B~C 同号时,三张卡片会落进同一组。
- 三档去重策略,默认档刻意保守:默认的「标准」档要求号码相同且姓名也相同(或有一方没写姓名)才合并。这一条是被现实逼出来的:家里共用一部座机、公司共用总机的通讯录很常见,光凭号码相同就把「张三」和「李四」合并,是最容易毁掉通讯录的错误。要合并「张三」与「张三(客户)」这种写法差异,得用户主动切到「宽松」档。
- 写回 vCard 3.0 时按 75 字节折行:折行按 UTF-8 字节数算而不是字符数:一个中文字符占 3 字节,按字符折行写出来一行 100 多字节,老设备导入时会截断。每个续行前加一个空格,这是 RFC 6350 的折行标记;读出端也按同一规则拼回去,读回时按同一规则拼回,往返前后内容一致(自测 H 组就在验这一点)。
技术栈:Python 3.8+、tkinter 图形界面、纯标准库(quopri / unicodedata / csv / threading,运行期零第三方依赖)、PyInstaller 单文件打包(--onefile --noconsole)
已知局限:只合并姓名、电话、邮箱、单位、职位、地址、备注、生日、网址、分组标签这些文本字段;头像(PHOTO)不参与合并也不写入输出,避免输出文件被 base64 撑到几十兆。Big5 编码的文件在极少数情况下可能被当成 GB18030 解出乱码(此时界面上会看到问号,可以先用记事本另存为 UTF-8 再处理)。姓名完全不同的两张卡片,标准档不会合并,需要手动切「宽松」档。
同类软件对照
下面几款都是公开可查的同类软件,定位各不相同。这里只说明各自的定位,以及本工具在其中的位置,方便你判断哪一类更契合自己的用法。
| 软件 | 它的定位 | 本工具的定位 |
|---|---|---|
| Google 通讯录(网页版) | 云端通讯录,支持导入多个 .vcf,并在网页里提供「合并重复的联系人」功能 | 本工具不需要账号、不联网,文件不出本机;处理的是本地 .vcf 文件本身,导出的结果再自行导入任意手机或邮件客户端 |
| Outlook(Windows 桌面版) | 邮件客户端自带的通讯录,导入 .vcf 后可以在联系人列表里查找并手动合并重复项 | 本工具不用先建邮箱账户,也不需要把联系人导入某个客户端;合并规则(严格/标准/宽松)可以自己选,并且能用对照表核对每一组的来源 |
| Thunderbird + CardBook 扩展 | 开源邮件客户端的地址簿扩展,用于集中管理多个地址簿中的联系人 | 本工具是单文件小程序,不做长期地址簿管理,只专注「把几份 .vcf 合成一份」这一步,用完即走 |
| 各类 vCard 在线合并网站 | 浏览器里上传 .vcf,服务端合并后下载结果,不需要安装任何程序 | 本工具全程离线,通讯录文件不会上传到任何服务器——通讯录属于隐私数据,这一点对很多人是硬要求 |
以上仅作定位对照,各软件的可用性、授权方式与功能范围请以其官方页面为准。
操作教程
- 解压后双击「通讯录合并去重.exe」
不需要安装 Python 或任何运行环境,程序直接打开一个窗口。也可以把 .vcf 文件(或整个文件夹)拖到 exe 图标上启动,文件会自动载入。
预期结果:窗口打开,顶部看到「选择 vCard 文件」按钮和一张空表格 - 点「选择 vCard 文件」,按住 Ctrl 把几个 .vcf 一起选中
如果有多个文件散在一个文件夹里,直接点「选择文件夹」更快——程序会连子文件夹一起找,只认 .vcf 与 .vcard。选完不需要再点「开始」,程序立刻开始合并。
预期结果:表格里出现合并后的联系人,合并条数大于 1 的行是淡蓝色底 - 看底部的统计结论
底部会写「原 N 条 → 合并后 M 条(去掉 X 条重复,其中 Y 组是多条合成)」。N 是原始名片数,M 是去重后的人数。如果 X 明显偏小,多半是号码写法差异太大,可以试试把策略切到「宽松」。
预期结果:统计里能对上你预期的重复条数 - 双击任意一行,核对这一组是由哪几张名片合成的
明细窗口列出该组里每张原始名片的来源文件、姓名、电话、邮箱。这一步是防误合并用的:如果发现两张本来不是同一个人,关掉窗口,把右上角的「去重策略」改成「严格」再看一次。
预期结果:明细窗口里能看到 2~3 行原始名片,字段与来源文件对得上 - 点「导出合并后的 vCard」,保存成 .vcf
默认文件名是「合并通讯录.vcf」。写完会提示条数;这一步只写新文件,不会改动你原来那几个 .vcf。
预期结果:目标文件夹里出现「合并通讯录.vcf」,大小通常比几份来源加起来小 - 把导出的 .vcf 传到手机,用系统「通讯录 → 导入」打开
导入前建议先在手机里备份一次现有通讯录(各家手机的「导出到存储」)。导入时如果系统问「合并还是替换」,选合并。
预期结果:手机通讯录里重复条目消失,号码与邮箱没有丢
常见问题
技术实现与后续维护
程序分三层:解析与去重逻辑完全独立于界面(不含任何窗口代码),界面层只负责编排与展示,入口层负责异常兜底。所以调整合并规则不会碰到界面,改界面也不会影响解析结果——这也是它能稳定处理各种脏格式的原因。运行环境只有一条要求:Windows 10/11 64 位,不需要装 Python、不需要装运行库,解压双击即可。每次迭代都会先跑一遍离线自测(109 项核心断言 + 16 项界面断言),确认解析、归一、去重、导出各条路径都正常才发布。
可扩展方向:
- 加「按单位分组去重」:同一家公司的联系人按公司聚合,方便批量补全部门与职位
- 加「只导出指定的组」:在表格里勾选若干行再导出,用于从大通讯录里挑一批人给某个项目用
- 支持 xlsx/csv 通讯录导入:先把表格里的姓名电话映射成 vCard 字段,再走同一套去重逻辑
- 加「相似姓名提示」:对拼音相同、只差一个字的两条给出提醒但不自动合并,交给用户判断
本工具免费提供使用,功能完整、不设限制。如果你需要在本工具基础上做功能调整、对接内部系统或长期维护,可以联系我们做二次开发。
需要其它功能?可以定制
这个工具只做一件事:换手机、多个账号各导出一份通讯录,合成时同一个人会出现两三条,一条条手动合并要看几百行。如果你的场景还需要别的处理,可以联系我们做二次开发,按你的实际数据格式和流程定制。
常见的定制需求:
- 把导出的通讯录按「客户 / 家人 / 同事」拆成多个 .vcf,分别导入不同分组
- 在合并的同时统一补上公司名与来源渠道,便于后续按来源筛选
- 对接企业微信/钉钉的通讯录导出格式,先转成标准 vCard 再合并
- 联系方式:邮箱/微信见站内「联系我们」页面,或在本文下方留言
- 定制说明:请附上你的数据样例(脱敏即可)和期望结果,方便快速评估工作量
- 交付形式:定制项目交付可执行程序,支持后续版本迭代与长期维护
使用说明与免责声明
- 本工具在本地运行,不联网、不上传任何数据到服务器。
- 涉及文件改写的功能,请在使用前备份原始文件。
- 软件完全免费,可自由使用与转发,请勿用于倒卖。
- 因误操作造成的数据问题请自行承担。

