0.基础知识
- seek方法是按照字节进行查找,UTF-8中文3字节,英文1字节。
- tell方法返回光标当前位置
- flush方法将缓存区中的数据写入硬盘,将关键数据手动存入硬盘防止断电丢失。
- readline方法只读一行遇到\r or \n停
要想修改文件,不是改写而是插入,首先打开文件加载到内存,然后修改,清除原先文件内容,最后将内存中数据重新存于硬盘的一个新区域。
1.例题1
- 全局文本检索替换,并且打印替换了多少处
- 调用方式:python your_script.py old_str new_str filename
import sys #导入外部参数
old_str = sys.argv[1]
new_str = sys.argv[2]
filename = sys.argv[3]
# 1. load into ram
f = open("filename","r+") # 拓展读模式,可改写
data = f.read()
# 2. count and replace
old_str_count = data.count(old_str)
new_data = data.replace(old_str,new_str)
# 3.clear old filename
f.seek(0) #将光标移动至最开始
f.truncate() #保留x个字节的文本,其余全部删除,x默认为0
# 4. save new data into file
f.write(new_data)
f.close()
print(f'"成功替换字符'{old_str}' to '{new_str}', 共计{old_str_count}处...")
2.例题2
- 登录认证程序
- 可判断账户是否存在 若存在有三次输入密码机会,若错误则锁定 若不存在则输出提示
# msgdb1:
szp,1a23,0
szsp,1aw23,0
szap,1a23,0
# 1.加载数据库
fr = open("msgdb1", "r")
account_db = {}
for line in fr:
line = line.strip().split(",") # strip() 去掉换行符; split(",") 以,拆分字符串
# print(line)
account_db[line[0]] = line
print(account_db)
# 2.账户处理
while True:
user_name = input("please input your account:")
if user_name not in account_db:
print("not find this account!")
else:
cnt = 1
while cnt <= 3:
pw = input("please input your password:")
if pw == account_db[user_name][1]:
exit(f"{user_name}, welcome!")
else:
print(f"password is false, you have {3 - cnt} chances to input!")
cnt += 1
account_db[user_name][2] = "1" # 修改内存中的数据库
fw = open("msgdb1", "w")
for user, var in account_db.items(): # account_db.items(): 返回一个包括所有元素的列表
line = ",".join(var) + "\n" # 把列表各个元素以“,"分隔再转成字符串
fw.write(line)
fr.close()
fw.close()
exit("your account have been locked!")