一 代码
def scode6(schoice):
default_dir = r"c:\ABDscode5.txt" # 设置默认打开的文件名称
# 按默认的文件名称打开文件选择对话框,用于打开已经存在的防伪码文件
file_path = tkinter.filedialog.askopenfilename(title=u"请选择已经生成的防伪码文件", initialdir=(os.path.expanduser(default_dir)))
codelist = openfile(file_path) # 读取从文件选择对话框选中的文件
codelist = codelist.split("\n") # 把读取的信息内容添加回车,以便列输出显示
codelist.remove("") # 删除列表中的空行
strset = codelist[0] # 读取一行数据,以便获取原验证码的字母标志信息
print(strset)
remove_digits = strset.maketrans("", "", digits) # 用maketrans方法创建删除数字的字符映射转换表
res_letter = strset.translate(remove_digits) # 根据字符映射转换表删除该条防伪码中的数字,获取字母标识信息
nres_letter = list(res_letter) # 把信息用列表变量nres_letter存储
strpro = nres_letter[0] # 从列表变量中取得第一个字母,即区域分析码
strtype = nres_letter[1] # 从列表变量中取得第二个字母,即色彩分析码
strclass = nres_letter[2] # 从列表变量中取得第三个字母,即版次分析码
# 去除信息中的括号和引号
nres_letter = strpro.replace(''''','').replace(''''', '') + strtype.replace(
''''','').replace(''''', '') + strclass.replace(''''','').replace(''''', '')
print("sssssssssss", nres_letter)
card = set(codelist) # 将原有防伪码放到集合变量card中
# 利用tkinter的messagebox提示用户之前生成的防伪码数量
tkinter.messagebox.showinfo("提示", "之前的防伪码共计:" + str(len(card)))
root.withdraw() # 关闭提示信息框
incount = inputbox("请输入补充验证码生成的数量:", 1, 0) # 让用户输入新补充生成的防伪码数量
# 最大值按输入生成数量的2倍数量生成新防伪码,防止新生成防伪码与原有防伪码重复造成新生成的防伪码数量不够,
for j in range(int(incount) * 2):
randfir = random.sample(number, 3) # 随机产生3位不重复的数字
randsec = sorted(randfir) # 对产生的数字排序
addcount = len(card) # 记录集合中防伪码的总数量
strone = "" # 清空存储单条防伪码的变量strone
for i in range(9): # 生成9位的数字防伪码
strone = strone + random.choice(number)
# 将三个字母按randsec变量中存储的位置值添加到数字防伪码中,并放到sim变量中
sim = str(strone[0:int(randsec[0])]) + strpro + str(
strone[int(randsec[0]):int(randsec[1])]) + strtype + str(
strone[int(randsec[1]):int(randsec[2])]) + strclass + str(strone[int(randsec[2]):9]) + "\n"
card.add(sim) # 添加新生成的防伪码到集合
# 如果添加到集合,证明生成的防伪码与原有的防伪码没有产生重复
if len(card) > addcount:
randstr.append(sim) # 添加新生成的防伪码到新防伪码列表
addcount = len(card) # 记录最添加新生成防伪码集合的防伪码数量
if len(randstr) >= int(incount): # 如果新防伪码列表中的防伪码数量达到输入的防伪码数量
print(len(randstr)) # 输出已生成防伪码的数量
break # 退出循环
# 调用函数wfile()函数,实现生成的防伪码屏幕输出和文件输出
wfile(randstr, nres_letter + "ncode" + str(choice) + ".txt", nres_letter, "生成后补防伪码共计:", "codeadd")
# tkinter.messagebox.showinfo("提示", "已生成补充防伪码共:" + str(len(randstr))) # 提示
# root.withdraw()
二 运行
三 说明
1 strset.maketrans("", "", digits)用法
表示要删除的字符组成的字符串,将digit映射为none。
参考:
https://www.runoob.com/python3/python3-string-maketrans.html
https://www.cnblogs.com/wushuaishuai/p/7687074.html
2 strset.translate(remove_digits)用法
参考:
https://www.runoob.com/python3/python3-string-maketrans.html
https://www.cnblogs.com/wushuaishuai/p/7687074.html
3 str.replace(''''','')用法
去掉字符串中的三引号