Python中从手机通讯录抓取的信息存入数据库之前需不需要处理?

Python中从手机通讯录抓取的信息存入数据库之前需不需要处理?

4 回复

点错了,sorry…


当然需要处理。直接从手机通讯录抓取的信息(通常称为“联系人”或“通讯录”数据)是原始数据,直接存入数据库会带来数据不一致、冗余甚至安全风险。主要处理步骤包括:

  1. 数据清洗:去除首尾空格、统一电话号码格式(如去掉+86、空格、短横线)、规范邮箱地址。
  2. 数据验证:检查手机号、邮箱格式是否有效,无效数据应标记或丢弃。
  3. 去重:根据关键字段(如手机号)合并重复联系人。
  4. 结构化:将非结构化数据(如一个字段包含“姓名/公司/职位”)拆分成独立的数据库字段。
  5. 编码处理:确保文本(尤其是姓名)的字符编码正确,防止乱码。

示例代码: 假设我们通过某个库(如contacts)获取了原始联系人列表,每个联系人是包含namephone的字典。我们将进行清洗和去重,然后使用SQLite保存。

import re
import sqlite3
from typing import List, Dict

def clean_phone(phone: str) -> str:
    """清洗电话号码:移除非数字字符,保留+号(国际号码)"""
    if not phone:
        return ""
    # 保留开头的+号和后续数字
    cleaned = re.sub(r'[^\d+]', '', phone)
    return cleaned

def clean_name(name: str) -> str:
    """清洗姓名:去除首尾空格"""
    if not name:
        return ""
    return name.strip()

def process_contacts(raw_contacts: List[Dict]) -> List[Dict]:
    """处理联系人列表:清洗并去重"""
    processed = {}
    for contact in raw_contacts:
        # 清洗数据
        name = clean_name(contact.get('name', ''))
        phone = clean_phone(contact.get('phone', ''))
        
        # 简单验证:至少要有姓名或电话之一
        if not name and not phone:
            continue
            
        # 以手机号为键去重,保留姓名更全的记录
        if phone in processed:
            if name and not processed[phone]['name']:
                processed[phone]['name'] = name
        else:
            processed[phone] = {'name': name, 'phone': phone}
    
    return list(processed.values())

def save_to_db(contacts: List[Dict], db_path: str):
    """将处理后的联系人保存到SQLite数据库"""
    conn = sqlite3.connect(db_path)
    cursor = conn.cursor()
    
    # 创建表
    cursor.execute('''
        CREATE TABLE IF NOT EXISTS contacts (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            name TEXT,
            phone TEXT UNIQUE
        )
    ''')
    
    # 插入数据
    for contact in contacts:
        try:
            cursor.execute(
                'INSERT INTO contacts (name, phone) VALUES (?, ?)',
                (contact['name'], contact['phone'])
            )
        except sqlite3.IntegrityError:
            # 手机号重复,跳过或更新
            pass
    
    conn.commit()
    conn.close()

# 模拟原始数据(实际中可能来自android-contacts或iOS库)
raw_contacts = [
    {'name': ' 张三 ', 'phone': '138 0013 8000'},
    {'name': '李四', 'phone': '+86-13912345678'},
    {'name': '王五', 'phone': '139-1234-5678'},
    {'name': '张三', 'phone': '13800138000'},  # 重复
    {'name': '', 'phone': 'invalid_phone'},
]

# 处理并保存
processed_contacts = process_contacts(raw_contacts)
save_to_db(processed_contacts, 'contacts.db')

print(f"原始联系人数量: {len(raw_contacts)}")
print(f"处理后联系人数量: {len(processed_contacts)}")
for c in processed_contacts:
    print(f"  {c['name']}: {c['phone']}")

总结:不处理直接存库是给自己挖坑。

从这个标题看来你会被喷的很惨 前排先占个座

正确的操作是。。。获取权限的时候,跟用户说使用加密的哈希特征匹配用户。。。然后实际上存的时候,明文保存用户整个通讯录。。。锤子那个子弹什么的好像就是这样操作的

回到顶部