手机归属地批量处理(后续)
上篇已经解决了如何大批量查询号码归属地的问题。
此时已经把一批号码资料导出成了csv(部分数据由于录入并不规范,所以存在不少无效错误的数据需要在入库和查询归属地接口前加工处理)
以下需要注意的若干点的备忘:
- 处理csv要去掉换行符及包裹数据的双引号;
- 文本编码,建议统一处理为utf-8;
- 多个csv 遍历建议处理完后移动或标记文件,避免遇错中断时无法分辨哪些数据已经处理;
- phone调用返回结果可能为None(归属地库无匹配);
- 手机号码合法性检查(长度、组成);
- 客户端或用户录入可能会自动在手机号码间插入字符“ ”或“-”, 例如 138-0013-8000;
python代码相关片段
import os
import re
from phone import Phone
import mysql.connector
from mysql.connector import Error
from mysql.connector import errorcode
db_cfg = mysql.connector.connect({马赛克})
p = Phone()
db = db_cfg.cursor()
sql ="INSERT IGNORE INTO `phone`(`phone`, `province`, `city`, `zipcode`, `areacode`, `sp`) " \
"VALUES (%s, %s, %s, %s, %s, %s);"
#判断是否合法手机号码,规则较为宽松,只要求11位数字 1开头
def isPhone(phone):
if len(phone)==11:
rp = re.compile('^1\d{10}')
return rp.match(phone)
else:
return False
#扫描csv文件,号码导入库
inp_path = './' #扫描目录
filelist = os.listdir(inp_path)
for dfile in filelist:
if dfile[-4:].lower() == ".csv": #目标文件
print("正在处理", dfile)
with open(inp_path+dfile, 'r', encoding="utf-8") as f:
lines = []
for line in f:
line = line.strip().replace('"', '').replace('-', '').replace(' ', '') #去除csv的双括号,兼容分隔符 -
if isPhone(line):
lines.append(line)
res = p.find(line)
if res == None:
print("find none at:", line)
else:
sp = res["phone_type"]
areacode = res["area_code"]
zipcode = res["zip_code"]
city = res["city"]
province = res["province"]
vals = (line, province, city, zipcode, areacode, sp)
try:
db.execute(sql, vals)
db_cfg.commit()
except mysql.connector.Error as err:
print("err line:", line, res)
print(err.msg)
#else:
#print("not phone:", line)
#exit()
print("all done")
