在恢复出厂设置时,把老爸的华为麦芒通讯录搞丢了,但老人家保留了一个比较早的一个通讯录电子表格,自己录入的格式没有固定。我就想有没有比较方便的方法,用代码写一个通讯录,再导入到手机里面。
1.华为麦芒vcard格式

如上图vcard代码格式,一个联系人有一个片段, 中文人名是通过Quoted-printable方式编码
Quoted-printable或QP encoding,没有规范的中文译名,可译为可打印字符引用编码或使用可打印字符的编码。Quoted-printable是使用可打印的ASCII字符(如字母、数字与“=”)表示各种编码格式下的字符,以便能在7-bit数据通路上传输8-bit数据, 或者更一般地说在非8-bit clean媒体上正确处理数据[注 1]。这被定义为MIME content transfer encoding,用于e-mail。
看不懂!其实更简单的是这样:
URL编码后把%换成=, 或者用utf-8编码把\x换成=如下:
1 | import urllib.parse as up |
看起来用url编码更好一点。如果几个号码,就会用多行TEL;CELL:连接,电话号码的格式为:XXX XXXX XXXX
2.Python 代码
1 | '''本程序是通过输入联系人和电话号码然后转为为华为手机vcard的vcf文件,vcf文件可以直接上传到华为手机通讯录。''' |
3.测试代码
1 | >>> |
生成了两个文件,一个是保存了数据,一个是需要vcard文件可以直接上传到手机通讯录

生成的vcard文件内容:
1 | BEGIN:VCARD |
可以看到我在输入电话号码时的空格自动删除了,中文名被编码显示,英文字母没有变。代码写好了,以后再遇到相同的情况就不需要一个名字一个数字的敲了。如果有提供有格式的联系人名单,还可以直接读取名单信息自动生成vcard文件。同时,不同的手机生成的vcard文件格式略有差别,特别是在中文人名的处理方式上不同,不过都可以通过字符串的一些操作来实现。
4.通讯录vcard逆向操作
如果我们得到一个vcard文件,需要马上知道里面是哪些人的电话号码就需要进行逆向操作了,这段代码不是我写的,来至记录一些最近用过的编码转换, 使用了正则表达式,还没有学到这个地方,先放在这里,后面再来研究。
1 | import re |
运行后就会把上一个代码保存的文件转译过来,英文字符还是不变,只看中文名部分。
1 | BEGIN:VCARD |
参考:
python之urlencode(),quote()及unquote()
总结:
- 本文用了urllib.parse, quote, pickle的用法
- 用了try..except..语句,join, split, 切片等对字符串进行操作