电话号码生成脚本优化:剔除曾经出现过的数据
数据 优化 生成 脚本 出现 电话号码 曾经 剔除
2023-09-11 14:21:25 时间
之前有写过一个生成电话号码的脚本,主要是因为当时在测的一个项目,需要用到大量的新手机号
在后期项目测试过程中,确实一直在借助这个脚本帮我造新号码,但是使用过程中也逐渐意识到一个问题:电话号码去重不是很彻底
原先的写法如下:
1 import random 2 3 list_1 = ["134", "135", "136", "137", "138", "139", "147", "150", "151", "152", "157", "158", "159", "172", "178", 4 "182", "183", "184", "187", "188", "198"] # 中国移动号码段 5 6 list_2 = ["130", "131", "132", "145", "155", "156", "166", "171", "175", "176", "185", "186"] # 中国联通号码段 7 8 list_3 = ["133", "149", "153", "173", "177", "180", "181", "189", "191", "199", "193"] # 中国电信号码段 9 10 num = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"] # 存放0-9数字,号码的4-11位从这里取 11 12 phone_all = list() # 存放所有生成的电话号码 13 phone_output = list() # 存放去重后的电话号码 14 15 16 def create_phone(count, choice): # 参数1为生成号码的个数,参数2为运营商选择 17 for t in range(count): 18 phone = random.choice(choice) + "".join(random.choice(num) for i in range(8)) #使用random函数生成电话号码 19 if phone not in phone_all: # 判断该电话号码是不是出现过 20 phone_output.append(phone) # 没出现则放到phone_output 21 phone_all.append(phone) # 把生成的每个号码都存起来,用去去重比对 22 print(phone_output) # 打印去重后的电话 23 24 25 if __name__ == '__main__': 26 create_phone(10, list_3)
第12行 phone_all 是用来判断去重的,但是结合create_phone()函数来看,它只能保证每次生成固定个数的号码时,例如一次生成10个,这10个中没有重复的;
而每次重新执行程序时,都会先给 phone_all 赋一个空列表[],所以不能持久保存追加到 phone_all 中的数据(通过运行脚本可以观察到每次phone_all都会打印出一个固定数量的列表,并没有按照固定数量递增)
还有一个原因:每次重启python后,再次运行脚本,就相当于重新开始了,之前生成过的号码可能还会再次出现
我的最终目的:无论脚本运行几次、无论是今天运行、还是明天运行,这期间所产生过的号码,都记录下来,后续再生成号码时,都去和这个记录比对,如果有重复的,就把它剔除
OK,明确上述情况后,对应的解决思路大致如下:
1、把每次运行程序时所产生的数据都存储到一个文件或者数据库中
2、后续都以这个文件或者数据库中的数据作为参照,来判断新生成的电话号码是否存在
考虑到只是存储数字,占用电脑存储空间有限,就直接选择把数据存到文件中了,所以接下来的重点本质上就是对文件的读写操作以及如何判断去重了,实现过程如下
1 import random 2 3 list_1 = ["134", "135", "136", "137", "138", "139", "147", "150", "151", "152", "157", "158", "159", "172", "178", 4 "182", "183", "184", "187", "188", "198"] # 中国移动号码段 5 6 list_2 = ["130", "131", "132", "145", "155", "156", "166", "171", "175", "176", "185", "186"] # 中国联通号码段 7 8 list_3 = ["133", "149", "153", "173", "177", "180", "181", "189", "191", "199", "193"] # 中国电信号码段 9 10 num = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"] 11 12 13 def write_file(file_name, data): 14 """ 15 向一个文件中写入数据 16 :param file_name: 文件名 17 :param data: 准备写入的数据 18 :return: 19 """ 20 with open(file_name, 'a+') as f: 21 f.write(data+"\n") # 每次追加一条数据后,都加一个换行符 22 23 24 def read_file(file_name): 25 """ 26 读取一个文件的数据 27 :param file_name: 28 :return: 29 """ 30 data = [] 31 with open(file_name, 'r') as f: 32 for t in f: 33 data.append(t.replace('\n', '')) # 将文件中的数据追加到一个列表中,方便后续比对 34 # print(data) 35 return data 36 37 38 def create_phone(count, choice): 39 """ 40 生成电话号码 41 :param count: 生成号码的数量 42 :param choice: 选择的号段 43 :return: 44 """ 45 phone_output = list() 47 48 file_data = read_file("/Users/rchera/PycharmProjects/test/phone.txt") # 读取文本中的数据 49 50 for t in range(count): 51 phone = random.choice(choice) + "".join(random.choice(num) for i in range(8)) 52 53 if phone not in file_data: 54 phone_output.append(phone) 55 write_file("/Users/rchera/PycharmProjects/test/phone.txt", phone) 56 else: 57 print("该号码已经出现过:{}".format(phone)) 58 59 file_data = read_file("/Users/rchera/PycharmProjects/test/phone.txt") 60 print(file_data) 61 63 # print(phone_output) 64 65 66 if __name__ == '__main__': 67 create_phone(5, list_3) 68 # read_file("/Users/rchera/PycharmProjects/test/phone.txt")
第59行,表示每生成一个号码追加到文件中后,再重新读取一次文件,这样可以确保file_data是最新的(file_data就是文件中的所有号码)
这样的话,phone.txt中会一直保存生成过的电话号码,每次运行脚本,都会来根据它来判断是否有已经存在的号码了
相关文章
- 面试题:大数据查询怎么优化? .
- 解决JavaScript使用eval构建json数据时的引号问题
- 当物体碰上大数据
- 分析Python中解析构建数据知识
- 最棒的7种R语言数据可视化
- MySQL100万条数据的一张表,如何查询优化?
- 到底什么才是DaaS数据即服务?别再被其他DaaS概念给误导了
- SAP UI5 应用的 OData 元数据请求响应的解析原理分析
- DL之NN/CNN:NN算法进阶优化(本地数据集50000张训练集图片),六种不同优化算法实现手写数字图片识别逐步提高99.6%准确率
- 数据库面试题【十五、优化查询过程中的数据访问】
- 基于帝企鹅算法优化BP神经网络实现数据预测(Matlab代码实现)
- 【需求响应】基于数据驱动的需求响应优化及预测研究(Matlab代码实现)
- 使用HGS算法调整PD控制器增益的无人机动态性能数据——基于启发式的无人机路径跟踪优化(Matlab代码实现)
- JavaScript基础修炼(14)——WebRTC在浏览器中如何获得指定格式的PCM数据【华为云分享】
- 基于PSO优化的SVM数据预测算法matlab仿真
- 基于Multi-Verse Optimizer(MVO)多元宇宙优化的DBSCAN数据聚类算法matlab仿真
- 数据结转性能优化,效果明显到不解释!
- Hawk 数据抓取工具 使用说明(二)
- 【Android 内存优化】Android 工程中使用 libjpeg-turbo 压缩图片 ( 初始化压缩对象 | 打开文件 | 设置压缩参数 | 写入压缩图像数据 | 完成压缩 | 释放资源 )
- 优化数据页面(18)——标注keyword
- VL31 -数据累加输出(移位寄存器):实现串行输入数据累加输出,每当模块接收到4个输入数据后,输出端输出4个接收到的数据的累加结果!(待续tb)
- 函数式编程——做到并发,不可变数据修改就只能复制后修改返回
- 使用深度学习检测DGA(域名生成算法)——LSTM的输入数据本质上还是词袋模型
- 【MySQL优化查询】MySQL单表过亿条数据,如何优化查询速度?
- Qt数据库应用6-数据图文混排
- Python开发学习之Python和Excel的数据实现互通