Python基础-文件读写、JSON
username,12345678 username2,abc12345
用户注册
#1.注册: #用户和密码存在文件里面 #username,123456 #username2,abc123 #读写文件 #1.要从文件里面取出来所有的用户名 #2.如果不存在就写入,存在就报用户名已注册 f = open("users.txt",'a+') #f.seek(0) res = f.read() all_user_name = [] #存放所有的用户名 for r in res.split('\n'): #['username,123456','username2,abc123'] #'username,123456' username = r.split(',')[0] all_user_name.append(username) for i in range(3): username = input('username:').strip() pwd = input('pwd:').strip() cpwd = input('cpwd:').strip() if not(len(username) > 6 and len(username) < 20): print("用户名长度不合法") elif not (len(pwd) >=8 and len(pwd) <= 20): print("密码长度不合法") elif pwd != cpwd: print("两次输入的密码不一致") elif username in all_user_name: print("用户名已经注册") else: user_info = '%s,%s\n'%(username,pwd) f.write(user_info) print("注册成功") break f.close()
用户登陆
# 用户从user.txt 中读取帐户和密码进行登陆 # res = open('users.txt').read() # username = input('username:') # pwd = input("pwd:") # user_info = username+','+pwd # if user_info in res: # print("登陆成功") # else: # print("登陆失败,帐号或密码错误") # all_user = {} res = open('users.txt').read() for r in res.split('\n'): #['username,12345678','username2,abc12345'] #'username,12345678' ['username,12345678'] if r.strip() != '': username = r.split(',')[0] pwd = r.split(',')[1] all_user[username] = pwd for i in range(3): username = input("username:") pwd = input('pwd:') if username in all_user: #if pwd == all_user.get(username): if pwd == all_user[username]: print("欢迎登录!") else: print("帐号/密码错误!") else: print("该用户未注册")
文件读写
r:只读,文件不存在,会报错w: 只写,会清空原有内容,文件不存在会新建
a: 追加写,不会清空,文件不存在会新建
r+: 读写模式,文件不存在会报错
w+: 写读模式,文件不存在会创建,文件会被删除后重写
a+: 追加读模式,文件不存在会创建,文件只会被追加
rb、wb、ab: 以二进制方式,多用于图像,多媒体数据等
文件读
f = open('users.txt') print(f.read()) #获取到文件里面所有的内容 print(f.read()) #再次读时会读不到内容 print(f.readlines()) #文件中所有内容,返回为list,文件中每行分别为一个元素 print(f.readline()) #一次读取一行内容
文件写
f1 = open('users.txt','a') a=['username1,123456\n','usrname2,123456\n'] for i in a: f1.write(i) #每次写入一行 f1.writelines(a) #writelines()方法用于将list写入文件
文件访问次数记录练习
# 1.要从日志中访问超过200次的 # 2.每分钟都运行一次 #思路: # 1.读取文件内容,获取IP地址 # 2.把每个IP地址存起来 #['192.168.1.1','192.168.1.2','192.168.1.3'] # 3.以字典方式存{'192.168.1.1':2,'192.168.1.3':5} #判断ip访问次数超过200次,如果字典的value超过200,加入黑名单 import time point = 0 #初始的位置 while True: ips = {} f = open('access.log',encoding='utf-8') f.seek(point) for line in f: #循环读取文件里面每行数据 ip = line.split(' ')[0] #按照空格分隔,取第一个元素ip if ip in ips: #判断这个IP是否存在 ips[ip] += 1 #如存在,次数+1 else: ips[ip] = 1 #不存在,IP次数为1 point = f.tell() #记录文件指针位置 f.close() for ip,count in ips.items(): #循环这个字典,判断次数大于200的 if count >= 200: print("%s 加入黑名单"%(ip)) time.sleep(60)
高效处理文件
f = open('access.log',encoding='utf-8') #f叫文件对象或文件句柄 #第一种用while循环 while True: line = f.readline() #一次只取一行 if line != '': print(line) else: print("文件内容读完,结束") break #第二种直接遍历文件 for line in f: print(line)
修改文件内容
#简单直接的方式 f = open(r'D:\file.txt',encoding='utf-8') res = f.read().replace('一点','二点') f.close() f = open(r'D:\file.txt','w',encoding='utf-8') f.write(res) f.close()
#方式二 f1 = open('file.txt','w+',encoding='utf-8') f1.seek(0) res = f1.read().replace('一点','hello') f1.seek(0) f1.truncate() #清空文件里的内容 f1.write(res) f1.close()
import os f2 = open('file.txt',encoding='utf-8') f3 = open('file.txt.bak','w',encoding='utf-8') for line in f2: new_line = line.replace('NI','NIIIIIIII') f3.write(new_line) f2.close() f3.close() os.remove('file.txt') os.rename('file.txt.bak','file.txt')
import os with open('file.txt',encoding='utf-8') as f1, open('file.txt.bak','w',encoding='utf-8') as f2: #使用with时,文件不用就会被自动关闭,可同时打开多个文件 for line in f1: new_line = line.replace("二点",'一点') f2.write(new_line) os.remove('file.txt') os.replace('file.txt.bak','file.txt')
JSON处理
JSON是一种通用的数据类型,所有的语言都认识
JSON是字符串
方法如下:
- loads() 字符串转为字典
- dumps() 字典转为字符串
- load() 直接传入一个含有字符串的文件对象,将字符串转为字典
- dump() 传入字典和文件对象,将字典转为字符串
如果涉及到文件,使用load()和dump()更方便
字符串转成字典 s = ''' { "error_code": 0, "stu_info": [ { "id": 8410, "name": "小黑1", "sex": "男", "age": 28, "addr": "河南省济源市北海大道32号", "grade": "天蝎座", "phone": "13488709889", "gold": 10401 }, { "id": 11089, "name": "小黑1", "sex": "男", "age": 28, "addr": "河南省济源市北海大道32号", "grade": "天蝎座", "phone": "18612511124", "gold": 100 } ] } ''' import json res = json.loads(s) #json串(字符串),转成字典 print(res) print(res.keys) print(type(res))
字典转为字符串 stus = {'xiaojun':'123456','xiaohei':'7891','xiaoliu':'111111','海龙':'111'} res2 = json.dumps(stus, indent=4,ensure_ascii=False) #indent为缩进,中文默认使用的ascii编码,中文需要ensure_ascii=False print(res2) print(type(res2)) with open('stus.json','w',encoding='utf-8') as f: f.write(res2)
可以通过读取文件中内容,将字符串转为字典 f = open('stus.json',encoding='utf-8') content = f.read() user_dict = json.loads(content) print(user_dict)
可能直接通用load(),传入文件对象将字符串转为字典 f = open('stus.json', encoding='utf-8') user_dict = json.load(f) #load()可以直接传入一个文件对象 print(user_dict)
使用dump()传入字典和文件对象将字典转为字符串 stus = {'xiaojun':'123456','xiaohei':'7891','xiaoliu':'111111','海龙':'111'} f = open('stus2.json','w',encoding='utf-8') json.dump(stus, f, indent=4, ensure_ascii=False)
相关推荐
luguanyou 2020-10-05
sdmzhu 2020-09-01
深井兮兮 2020-07-18
yoshubom 2020-07-18
ITlover00 2020-04-29
baike 2020-04-26
atb 2020-04-18
hitxueliang 2020-03-23
ALiDan 2020-02-16
老谢的自留地 2020-01-11
赵家小少爷 2019-12-18
secondid 2019-12-23
chvnetcom 2019-12-15
benico 2019-12-15
pengkunstone 2019-12-14
zhongzhiwei 2019-12-11
Proudoffaith 2019-12-10
sunln00 2019-12-09