电话号码生成脚本优化:剔除曾经出现过的数据
之前有写过一个生成电话号码的脚本,主要是因为当时在测的一个项目,需要用到大量的新手机号
在后期项目测试过程中,确实一直在借助这个脚本帮我造新号码,但是使用过程中也逐渐意识到一个问题:电话号码去重不是很彻底
原先的写法如下:
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中会一直保存生成过的电话号码,每次运行脚本,都会来根据它来判断是否有已经存在的号码了