####################處理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的都是和文件相關的
import json res = json.loads(s) #json串(字符串)轉換為字典 print(res) print(type(res)) for k,v in res.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、 import sys 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、 import os f = open('file.txt',encoding='utf-8') f2 = open('file.txt.bak','w',encoding='utf-8') for line in f: 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就不用關閉文件,自動關閉 #同時打開多個文件 import os with open('file.txt',encoding='utf-8') as f,open('file.txt.bak','w',encoding='utf-8') as f2: for line in f: 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') # 文件對象、文件句柄-->都是打開一個文件
# 第一種方式,整個過程只有一個變量,節省內存 while True: line = f.readline() if line != '': print('line:',line) else: print('文件內容都讀完了,結束了') break
#第二種方式,兩行代碼就等於第一種方式的效果,讀到文件中的全部內容 #直接循環文件的對象,等於取得文件中每一行的內容 for line in f: 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 } 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] = 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)