1.写一个脚本,对指定文件内容进行全局替换,并且替换完成后打印替换了多少处内容
写完后的脚本调用方式:
python your_script.py old_str new_str filename
import sys #导入sys包
print(sys.argv) #打印一下,会显示出当前路径['C:/pycharmProjects/python2023特训营/Day02/file_replace.py']
old_str = sys.argv[1] #sys.argv[1]代表第一个参数,赋值给old_str
new_str = sys.argv[2] #sys.argv[2]代表第二个参数,赋值给new_str
filename = sys.argv[3] #sys.argv[3]代表第三个参数表示文件名,赋值给filename
# 1.先写入内存
f = open(filename, "r+", encoding="utf-8") #注意文件编码格式
data = f.read() #将文件内容读到data中
# 2.计算替换次数,替换
old_str_count = data.count(old_str) #计算第一个参数出现的次数
new_data = data.replace(old_str, new_str) #将老参数替换为新参数,并且赋值给新文件
# 3.清空老文件
f.seek(0) #移动光标到第一位
f.truncate() #截断光标后的文件,光标在第一位表示全部截断
# 4.写入并保存新文件
f.write(new_data) #写入新文件
f.close() #保存并关闭文件
print(f"成功替换字符{old_str}to{new_str},共{old_str_count}处...") #打印结果
进入terminal,必须要让你现在的位置处于,你的脚本文件的位置,如果不在,则会找不到文件无法运行脚本文件,查看自己脚本文件的位置,然后通过cd命令进入:
PS C:\pycharmProjects\python2023特训营> cd C:\pycharmProjects\python2023特训营\Day02
然后输入脚本命令,python file_replace.py打开我的脚本python文件,17 为我都第一个参数,199为我的第二个参数,name_list是我需要操作的对象文件名:
PS C:\pycharmProjects\python2023特训营\Day02> python file_replace.py 17 199 name_list
['file_replace.py', '17', '199', 'name_list']
成功替换字符17to199,共4处...
最后还需要注意编码问题,因为没加这个encoding="utf-8"导致报错
f = open(filename, "r+", encoding="utf-8")
2.用户登录认证程序
要求用户输入账号密码进行登录
用户账号信息保存在文件内
用户密码输入错误三次后锁定用户,下次再登录,检测到是这个被锁定的用户,则依然不允许其登录,提示已被锁
# 1. 确定在文件里存储的账号信息结构
# iwbf,abc123!,1 iwbf为账号,abc123!为密码,1表示为锁定
# 2. 把账号数据读到内存,为了方便调用,可以改为list,但是字典更好
accounts = {
} #创建一个空字典
# 打开已经准备好的一个账号数据文本,模式为读,编码格式为utf-8
f = open("account.db", "r", encoding="utf-8")
for line in f: #循环文件每一行内容
#先用strip将文件中每行数据去掉空格或者/n,再用split将字符串以,为分隔符,分隔字符串为列表。存在变量line中
line = line.strip().split(",")
accounts[line[0]] = line #line[0]取出列表第一个元素作为字典的键,并且将列表存入字典中
print(accounts) #打印字典
# 3. 搞个loop,要求用户输入账号信息,去判断就可以了
while True: #死循环
user = input("Username:").strip() #用户名等于用户输入的值,并且去除空格等误操作影响判断
if user not in accounts: #用in判断用户输入的账号是否不存在于字典当中
print("该用户未注册...") #如果不存在那么判断为未注册
continue #不执行下面的操作,让用户重新输入账号
elif accounts[user][2] == "1": #取字典当中下标为2的元素,判断这个元素是否为字符1
print("此账号已锁定,请联系管理员...") #如果是,那么代表这个账号为被锁定账号
continue #不执行下面的操作,让用户重新输入账号
count = 0 #结果上面的判断,证明用户已经输入了一个正确的账号,那么开始计数用户输入密码的次数
while count < 3: # 控制密码输入次数
passwd = input("Password:").strip() #passwd为用户输入的密码
if passwd == accounts[user][1]: #拿字典里的密码和用户输入的密码做对比
print(f"Welcome{user}...登陆成功...") #对了就输入登陆成功退出程序
exit("byebye....")
else:
print("Wrong passwrd.....") #输入错误就显示输入错误,将计数器+1再进入循环让用户重新输入
count += 1
if count == 3: #如果程序没结束,那么就意味着用户已经输入三次错误密码
print(f"输错了{count}密码,需要锁定账号{user}...")
accounts[user][2] = "1" #经过上面的循环记录了用户输入三次错误密码的账号,然后将账号的锁定值改为1
f2 = open("account.db", "w", encoding="utf-8") #打开文件写入新数据
for user, val in accounts.items(): #items函数可以返回字典中所有的(key和vlaue)元组的列表,用user接受字典返回的key值,val接收返回的value值
line = ",".join(val) + "\n" #将字典以,为分隔变成字符串,只取其中value值并且加上\n
f2.write(line) #将line写进字符串中
f2.close()
exit("bye------")