Python中从手机通讯录抓取的信息存入数据库之前需不需要处理?
Python中从手机通讯录抓取的信息存入数据库之前需不需要处理?
4 回复
点错了,sorry…
当然需要处理。直接从手机通讯录抓取的信息(通常称为“联系人”或“通讯录”数据)是原始数据,直接存入数据库会带来数据不一致、冗余甚至安全风险。主要处理步骤包括:
- 数据清洗:去除首尾空格、统一电话号码格式(如去掉
+86、空格、短横线)、规范邮箱地址。 - 数据验证:检查手机号、邮箱格式是否有效,无效数据应标记或丢弃。
- 去重:根据关键字段(如手机号)合并重复联系人。
- 结构化:将非结构化数据(如一个字段包含“姓名/公司/职位”)拆分成独立的数据库字段。
- 编码处理:确保文本(尤其是姓名)的字符编码正确,防止乱码。
示例代码:
假设我们通过某个库(如contacts)获取了原始联系人列表,每个联系人是包含name和phone的字典。我们将进行清洗和去重,然后使用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']}")
总结:不处理直接存库是给自己挖坑。
从这个标题看来你会被喷的很惨 前排先占个座
正确的操作是。。。获取权限的时候,跟用户说使用加密的哈希特征匹配用户。。。然后实际上存的时候,明文保存用户整个通讯录。。。锤子那个子弹什么的好像就是这样操作的

