前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >电话号码生成脚本优化:剔除曾经出现过的数据

电话号码生成脚本优化:剔除曾经出现过的数据

作者头像
冰霜
发布2022-03-19 09:06:30
4240
发布2022-03-19 09:06:30
举报

之前有写过一个生成电话号码的脚本,主要是因为当时在测的一个项目,需要用到大量的新手机号

在后期项目测试过程中,确实一直在借助这个脚本帮我造新号码,但是使用过程中也逐渐意识到一个问题:电话号码去重不是很彻底

原先的写法如下:

代码语言:javascript
复制
import random

list_1 = ["134", "135", "136", "137", "138", "139", "147", "150", "151", "152", "157", "158", "159", "172", "178",
          "182", "183", "184", "187", "188", "198"]  # 中国移动号码段

list_2 = ["130", "131", "132", "145", "155", "156", "166", "171", "175", "176", "185", "186"]  # 中国联通号码段

list_3 = ["133", "149", "153", "173", "177", "180", "181", "189", "191", "199", "193"]  # 中国电信号码段

num = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]  # 存放0-9数字,号码的4-11位从这里取

phone_all = list()  # 存放所有生成的电话号码
phone_output = list() # 存放去重后的电话号码


def create_phone(count, choice): # 参数1为生成号码的个数,参数2为运营商选择
    for t in range(count):
        phone = random.choice(choice) + "".join(random.choice(num) for i in range(8))  #使用random函数生成电话号码
        if phone not in phone_all:  # 判断该电话号码是不是出现过
            phone_output.append(phone)  # 没出现则放到phone_output
        phone_all.append(phone) # 把生成的每个号码都存起来,用去去重比对
    print(phone_output)  # 打印去重后的电话


if __name__ == '__main__':
    create_phone(10, list_3)

第12行 phone_all 是用来判断去重的,但是结合create_phone()函数来看,它只能保证每次生成固定个数的号码时

例如一次生成10个,这10个中没有重复的

而每次重新执行程序时,都会先给 phone_all 赋一个空列表[],所以不能持久保存追加到 phone_all 中的数据(通过运行脚本可以观察到每次phone_all都会打印出一个固定数量的列表,并没有按照固定数量递增)

还有一个原因:每次重启python后,再次运行脚本,就相当于重新开始了,之前生成过的号码可能还会再次出现

我的最终目的:无论脚本运行几次、无论是今天运行、还是明天运行,这期间所产生过的号码,都记录下来,后续再生成号码时,都去和这个记录比对,如果有重复的,就把它剔除

OK,明确上述情况后,对应的解决思路大致如下:

1、把每次运行程序时所产生的数据都存储到一个文件或者数据库中

2、后续都以这个文件或者数据库中的数据作为参照,来判断新生成的电话号码是否存在

考虑到只是存储数字,占用电脑存储空间有限,就直接选择把数据存到文件中了

所以接下来的重点本质上就是对文件的读写操作以及如何判断去重了,实现过程如下

代码语言:javascript
复制
import random

list_1 = ["134", "135", "136", "137", "138", "139", "147", "150", "151", "152", "157", "158", "159", "172", "178",
           "182", "183", "184", "187", "188", "198"]  # 中国移动号码段

list_2 = ["130", "131", "132", "145", "155", "156", "166", "171", "175", "176", "185", "186"]  # 中国联通号码段

list_3 = ["133", "149", "153", "173", "177", "180", "181", "189", "191", "199", "193"]  # 中国电信号码段

num = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
 
def write_file(file_name, data):
   """
   向一个文件中写入数据
   :param file_name: 文件名
   :param data: 准备写入的数据
   :return:
   """
   with open(file_name, 'a+') as f:
     f.write(data+"\n")  # 每次追加一条数据后,都加一个换行符
 
 
def read_file(file_name):
     """
     读取一个文件的数据
     :param file_name:
     :return:
     """
     data = []
     with open(file_name, 'r') as f:
         for t in f:
             data.append(t.replace('\n', ''))  # 将文件中的数据追加到一个列表中,方便后续比对
         # print(data)
         return data
 
 
def create_phone(count, choice):
     """
     生成电话号码
     :param count: 生成号码的数量
     :param choice: 选择的号段
     :return: 
     """
     phone_output = list()
 
     file_data = read_file("/Users/rchera/PycharmProjects/test/phone.txt")  # 读取文本中的数据
 
     for t in range(count):
         phone = random.choice(choice) + "".join(random.choice(num) for i in range(8))
 
         if phone not in file_data:
             phone_output.append(phone)
             write_file("/Users/rchera/PycharmProjects/test/phone.txt", phone)
         else:
             print("该号码已经出现过:{}".format(phone))
 
         file_data = read_file("/Users/rchera/PycharmProjects/test/phone.txt")
         print(file_data)
 
         phone_all.append(phone)
     # print(phone_output)
 
 
if __name__ == '__main__':
    create_phone(5, list_3)
    # read_file("/Users/rchera/PycharmProjects/test/phone.txt")

第57行表示:每生成一个号码追加到文件中后,再重新读取一次文件,这样可以确保file_data是最新的(file_data就是文件中的所有号码)

这样的话,phone.txt中会一直保存生成过的电话号码,每次运行脚本,都会根据它来判断是否有已经存在的号码了


顶部那张图是跟着一个ps达人做的

我功力还不够,ps痕迹有点明显,哈哈

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 冰霜blog 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档