1. 编写 Python 脚本,生成 xxx 个联系人信息 .csv 文件

  2. 进入 网页版-QQ 邮箱 - 通讯录 (管理 - 导入联系人文件),上传生成的 .csv 文件

  3. QQ 邮箱 - 通讯录 (管理 - 导出联系人文件),格式选择:vCard 格式

  4. 传到 IOS/安卓 手机, 选择文件,导入通讯录

注意点:导出上限:每次 1000 左右; 导入上限:每次 3000 左右

😂 使用改良版本,将生成 vCard 格式 文件,传到 手机就行。

改良版本

1. random_name_phone.py 生成随机联系人数据

#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
@author:Zx
@file: random_name_phone.py
@time: 2025/9/5  17:45
# @describe: 生成
"""
import json
import random
import csv

# 中文姓氏列表
surnames = ['赵', '钱', '孙', '李', '周', '吴', '郑', '王', '冯', '陈', '褚', '卫', '蒋', '沈', '韩', '杨',
            '朱', '秦', '尤', '许', '何', '吕', '施', '张', '孔', '曹', '严', '华', '金', '魏', '陶', '姜',
            '戚', '谢', '邹', '喻', '柏', '水', '窦', '章', '云', '苏', '潘', '葛', '奚', '范', '彭', '郎',
            '鲁', '韦', '昌', '马', '苗', '凤', '花', '方', '俞', '任', '袁', '柳', '酆', '鲍', '史', '唐',
            '费', '廉', '岑', '薛', '雷', '贺', '倪', '汤', '滕', '殷', '罗', '毕', '郝', '邬', '安', '常',
            '乐', '于', '时', '傅', '皮', '卞', '齐', '康', '伍', '余', '元', '卜', '顾', '孟', '平', '黄']

# 中文名字字符列表(男性和女性常用字)
name_chars = ['伟', '芳', '娜', '秀', '英', '敏', '静', '建', '强', '军', '杰', '磊', '洋', '艳', '玲', '丽',
              '刚', '勇', '鹏', '超', '明', '霞', '燕', '华', '平', '鑫', '晶', '亮', '健', '凯', '飞', '波',
              '宁', '栋', '博', '宇', '森', '琳', '丹', '莹', '雪', '慧', '璐', '婷', '欣', '颖', '悦', '翔',
              '海', '峰', '阳', '帅', '帅', '琦', '瑞', '凡', '思', '宏', '云', '睿', '哲', '泽', '嘉', '子',
              '浩', '轩', '宇', '涵', '一', '逸', '文', '辰', '沐', '梓', '艺', '欣', '梦', '雨', '彤', '馨']


def generate_random_name():
    """生成随机中文姓名"""
    surname = random.choice(surnames)
    # 随机生成1或2个字的名字
    if random.random() > 0.5:
        name = ''.join(random.sample(name_chars, 1))
    else:
        name = ''.join(random.sample(name_chars, 2))
    return surname + name


def generate_random_phone():
    """生成随机中国手机号"""
    # 手机号前缀:常见的前三位
    prefixes = ['130', '131', '132', '133', '134', '135', '136', '137', '138', '139',
                '150', '151', '152', '153', '155', '156', '157', '158', '159',
                '180', '181', '182', '183', '184', '185', '186', '187', '188', '189']

    prefix = random.choice(prefixes)
    # 生成后8位数字
    suffix = ''.join([str(random.randint(0, 9)) for _ in range(8)])
    return prefix + suffix


def generate_contacts(num_contacts):
    """生成指定数量的联系人"""
    contacts = []
    for i in range(num_contacts):
        name = generate_random_name()
        phone = generate_random_phone()
        contacts.append({"Name": name, "Phone": phone})
    return contacts


def save_to_json(contacts, filename):
    """保存为JSON文件"""
    with open(filename, 'w', encoding='utf-8') as f:
        json.dump(contacts, f, ensure_ascii=False, indent=2)


def save_to_csv(contacts, filename):
    """保存为CSV文件(可选)"""
    with open(filename, 'w', newline='', encoding='utf-8-sig') as f:
        writer = csv.DictWriter(f, fieldnames=['Name', 'Phone'])
        writer.writeheader()
        writer.writerows(contacts)


# 生成1000个联系人
contacts_list = generate_contacts(1000)

# 保存为JSON文件
save_to_json(contacts_list, 'random_contacts.json')
print("已生成 random_contacts.json 文件")

# 可选:同时保存为CSV文件(方便其他用途)
save_to_csv(contacts_list, 'random_contacts.csv')
print("已生成 random_contacts.csv 文件")

# 打印前5个作为示例
print("\n前5个联系人的示例:")
for i, contact in enumerate(contacts_list[:5]):
    print(f"{contact['Name']}, {contact['Phone']}")
  



2. csv_to_vcard.py  .csv 通讯录文件 转成 vCard格式 文件

#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
@author:Zx
@file: csv_to_vcard.py
@time: 2025/9/8  11:48
# @describe: 将 .csv 通讯录文件, 转成 vCard格式 文件
"""

import csv


def csv_to_vcard(csv_filename, vcf_filename):
    """
    将CSV文件转换为vCard格式
    """
    try:
        with open(csv_filename, mode='r', encoding='utf-8-sig') as csv_file:
            csv_reader = csv.DictReader(csv_file)

            # 检查列名
            print(f"检测到的列名: {csv_reader.fieldnames}")

            with open(vcf_filename, mode='w', encoding='utf-8') as vcf_file:
                contact_count = 0

                for row in csv_reader:
                    try:
                        name = row['Name'].strip()
                        phone = row['Phone'].strip()

                        # 生成vCard格式
                        vcard = [
                            'BEGIN:VCARD',
                            'VERSION:3.0',
                            f'N:{name}',
                            f'FN:{name}',
                            f'TEL;TYPE=CELL,VOICE:{phone}',
                            'END:VCARD'
                        ]

                        # 写入文件
                        vcf_file.write('\n'.join(vcard) + '\n\n')
                        contact_count += 1

                    except KeyError as e:
                        print(f"错误: 找不到列 {e}")
                        return
                    except Exception as e:
                        print(f"处理行时出错: {e}")
                        continue

                print(f"转换完成!成功转换 {contact_count} 个联系人到 {vcf_filename}")

    except FileNotFoundError:
        print(f"错误: 找不到文件 {csv_filename}")
    except Exception as e:
        print(f"发生错误: {e}")


if __name__ == "__main__":
    csv_filename = 'random_contacts.csv'
    vcf_filename = 'contacts.vcf'

    csv_to_vcard(csv_filename, vcf_filename)


↙↙↙阅读原文可查看相关链接,并与作者交流