需求
用文件存储用户的账户密码信息,注册时检测用户名重复与字符合法性
- 代码
#!/usr/bin/env python
# coding: utf-8
#copyRight by heibanke
##########################################
import os
data1=[]
filename='a.txt'
if os.path.exists(filename):
for line in open(filename,'r'):
a=line.split(',')
data1.append(a[0])
print data1
########################## 2-2 ################
import random
charactor='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'
first_c='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
while True:
# generate name
print u"注册\n请输入用户名(首字符必须是字母, 最小长度为4, 大小写字母,数字,_,-,的组合):"
name = raw_input()
#valid用于判断是否写入文件
valid = True
#检查用户名是否有效
if len(name)<4:
print u"你的输入%s不够4位, 请重新输入!"%(name)
valid = False
elif not name[0] in first_c:
print u"你的输入%s首字符必须是字母, 请重新输入!"%(name)
valid = False
else:
for a in name:
if not a in charactor:
valid = False
print u"你的输入%s有非法字符, 请重新输入!"%(name)
break
else:
#检查是否已存在
if name in data1:
print u"这个用户名%s已经存在,请重新输入!"%(name)
valid = False # generate password
# 密码是否有效
if valid:
#valid_pwd用于判断密码是否有效
valid_pwd=False
print u"该用户名可以使用,请输入密码(最小长度为6, 大小写字母,数字,_,-,的组合):"
while valid_pwd==False:
password = raw_input()
#输入reset则跳出密码循环,重新回到输入用户名环节
if password=="reset":
valid=False
valid_pwd=True
break
#检查是否有效
if len(password)<6:
print u"你的输入密码%s不够6位, 请重新输入! (输入reset则重新输入用户名)"%(password)
valid_pwd=False
continue
else:
for a in password:
if not a in charactor:
valid_pwd=False
print u"你的输入密码%s有非法字符, 请重新输入! (输入reset则重新输入用户名)"%(password)
break
else:
valid_pwd=True
#write file
if valid:
file = open(filename, 'a')
# md5 process
import hashlib
password_md5 = hashlib.md5(password).hexdigest()
file.write(name+','+password_md5+'\n')
file.close()
print u"恭喜你,注册成功"
break
- 文件操作总结--xinchrome
- split()函数:无参数则以空格为界划分,有则以参数划分
str="hello boy<[www.doiido.com]>byebye"
str.split("[")[1].split("]")[0]
'www.doiido.com'
str.split("[")[1].split("]")[0].split(".")
['www', 'doiido', 'com']
例子来自宋桓公博客园,分析:
先以 [ 为界化为两部分,第二部分再以 ] 为界化为两部分,取出了‘www.doiido.com’,再以.为界取出三部分
- 与split()相反,join()将字符串、元组、列表中的元素以指定的字符(分隔符)连接生成一个新的字符串
>>> seq1 = ['hello','good','boy','doiido']
>>> print ' '.join(seq1)
hello good boy doiido
>>> print ':'.join(seq1)
hello:good:boy:doiido
- 成员运算符in与not in:
>>> list = [1,2,3]
>>> str='abcd'
>>> p1=1
>>> p2='a'
>>> print p1 in list
True
>>> print p2 in str
True
-
关于本题中的文件
file.write(name+','+password_md5+'\n')
即字符串以“账户,密码\n”的形式逐行存入a.txt
for line in open(filename,'r'):
a=line.split(',')
data1.append(a[0])
print data1
data1是一个列表,利用split 以‘,’为分界提取出账户和密码
- hashlib模块
提供许多加密算法,md5是不可逆加密算法,常用于密码存储,
>>> import hashlib
>>> a = 'SYSinsight'
>>> print hashlib.md5(a).hexdigest()
06ecafe5c18a9d86866964b8785529f7