python3 json文件_python3学习(四)-- json处理、文件处理

####################处理json#########################

# json 一种通用的数据类型,所有的语言都认识

# 很像字典,都是花括号,k-v,但是json是字符串,不能通过k-v来取值

# json转成字典

# http://www.bejson.com/ 可以在该网址中校验json格式对不对

# json串就是字符串,多行字符串的定义用三个引号,json中的k-v对,只能用双引号。

# json.dumps()用于将dict类型的数据转成str。

# json.dump()用于将dict类型的数据转成str,并写入到json文件中。

# json.loads()用于将str类型的数据转成dict。

# json.load()用于从json文件中读取数据。

# .dumps .loads 方法 带s都是和字符串相关的,不带s的都是和文件相关的

importjson

res= json.loads(s) #json串(字符串)转换为字典

print(res)print(type(res))for k,v inres.items():print(k,'--->',v)print(res.keys())print(res.values())print(type(res))print(type(s))

stus = {'哈哈哈': '1234567', 'xiaojun': '123456', 'xiaohei': '123456789', 'tanailing': '12345678'}

res2= json.dumps(stus,indent=4,ensure_ascii=False)print(res2) #打印后可以发现,变成字典之后,变成双引号

with open('stus.json','w',encoding='utf-8') as f:

f.write(res2)print(type(res2))

f = open('stus.json', encoding='utf-8') #打开文件,将文件转成字典,要read

content =f.read()

user_dic= json.loads(content) #传的是字符串

print(user_dic)

f= open('stus.json', encoding='utf-8') #打开文件,不需要read,只需要传文件f

user_dic = json.load(f) #传的是文件对象

print(user_dic)print(type(stus))

f= open('stus2.json', 'w', encoding='utf-8')

json.dump(stus, f, indent=4, ensure_ascii=False) #用dump不需要read

####################文件读写#########################

#r 只读,打开文件不存在的话,会报错

#w 只写,会清空原文本中的内容。打开文件不存在时,新建一个文件

#a 追加写,写、读,不清空原文本中的内容。打开文件不存在时,新建一个文件

#r 读 ,区分read和readlines

f = open('user.txt') #python3 #file('a.txt') #python2中的方法#print('read:', f.read()) #获取到文件中的所有内容,把所有内容读完,在此读就没了,所以read和readlines都运行,只读第一次#print('readlines:',f.readlines()) #获取到文件中的所有内容,保存到一个list里面

print('read:',f.read()) #读取所有的行

print('readline:',f.readline()) #每次只读取一行

#w 写 ,写字符串用write,写list用writelines比较高效#f.write('')#只能写字符串

f = open('user.txt','a+')

a= ['user1,123\n','user2,123\n','user3,123\n']

f.writelines(a)#可以写一个list

#r+ 读写模式,打开不存在的文件会报错#w+ 写读模式,会清空内容#a+ 追加模式 ,不存在该文件时会创建#r+和w+分别试一下能不能读写,r+打开不存在的文件是否会报错

f = open('user.txt','a+',encoding='utf-8')print('1',f.readlines())

#二进制方式打开,后面加个b。例如rb,wb,ab+#python 上传文件,用‘rb’

res = open('333.jpg','rb')print(res.read())

####################修改文件内容#########################

#1、简单、粗暴直接的方式

f = open(r'C:\Users\Administrator\PycharmProjects\Day4\file.txt',encoding='utf-8') #路径前面加r,代表是路径,避免产生转义字符

res = f.read().replace('一点','二点')

f.close()

f= open(r'C:\Users\Administrator\PycharmProjects\Day4\file.txt',mode = 'w',encoding='utf-8')

f.write(res)

f.flush()#立即把缓冲区里面的内容写到磁盘

f.close()

#2、

importsys

f= open('file.txt','a+',encoding='utf-8')

f.seek(0)

res= f.read().replace('UUUUUUUUU', '你')

f.seek(0)

f.truncate()#清空文件里面的内容

f.write(res)

f.close()#缓冲区为0

#3、

importos

f= open('file.txt',encoding='utf-8')

f2= open('file.txt.bak','w',encoding='utf-8')for line inf:

new_line= line.replace('你','YOU')

f2.write(new_line)

f.close()

f2.close()

os.remove('file.txt')

os.rename('file.txt.bak','file.txt')

#4、用with就不用关闭文件,自动关闭#同时打开多个文件

importos

with open('file.txt',encoding='utf-8') as f,open('file.txt.bak','w',encoding='utf-8') as f2:for line inf:

new_line= line.replace('二点','一点')

f2.write(new_line)

os.remove('file.txt')

os.rename('file.txt.bak','file.txt')

####################高效处理文件#########################

f = open('user2.txt',encoding = 'utf-8')#文件对象、文件句柄-->都是打开一个文件

#第一种方式,整个过程只有一个变量,节省内存

whileTrue:

line=f.readline()if line != '':print('line:',line)else:print('文件内容都读完了,结束了')break

#第二种方式,两行代码就等于第一种方式的效果,读到文件中的全部内容#直接循环文件的对象,等于取得文件中每一行的内容

for line inf:print(line)

例子:

###########监控日志排查是否存在攻击的ip,若有,则屏蔽该ip##########1、要从日志里面找到1分钟之内访问超过200次的#2、每分钟都运行一次

#1、读取文件,获取到ip地址#2、把每个ip地址存起来[]?{}。用字典好,ip做k,次数做v#3、判断ip访问的次数是否超过200次#4、找到ip,打印出来#list ['118.24.4.30','118.24.4.30','118.24.1xx.x.xx','118.1x.x.x'] #可以实现,但是不好,因为ip越多,文件越大,且要循环list

dict

{'118.24.4.30':2,'118.24.4.30':5}importtime

point= 0 #初始位置

whileTrue:

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] = ips[ip] + 1

ips[ip]+=1 #如果存在的话就+1

else:

ips[ip]= 1 #如果不存在,ip当成k,1当成v,存入字典

point = f.tell() #记录文件指针位置

f.close() #记录完指针后就关闭

for ip,count in ips.items(): #item循环字典,判断次数大于200的。

if count >= 200:print('%s, 加入黑名单'%(ip))

time.sleep(60)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值