f = open("regist2.txt", 'r', encoding='utf-8')
# r read 只能讀不能寫,文件不存在的時候會報錯
# w write 文件不存在的話,給創建,不能讀,寫之前會清空原來的文件內容
# a 追加模式 不會清空原來的內容 追加寫,但是不能讀
# r+ 讀寫模式 文件不存在的時候會報錯 可讀可寫,但是寫的有問題(在最前方寫,因為指針在0處)
# w+ 寫讀模式 文件不存在的時候給創建 清空文件內容,然后在寫
# a+ 追加模式 文件不存在的時候給創建 可讀可寫 ,追加寫,但是讀不到內容(因為指針在末尾,所以讀不到)
###########################文件的用法##########################
# f.seek(0) # 文件指針移到最前面
# les=f.readline() #讀取一行的內容
# les3=f.readlines() #讀取所有行的內容,然后放在list ['明天周一今天周日好\n', '11\n', '22']
# les3 = f.read() #讀取文件的所有內容
#f.seek(0)
# f.truncate() # 從文件指針的地方開始刪除內容,結合f.seek()使用
# f.tell() # 當前文件指針的位置
f.close() #open 之后要close 關閉文件
######另外一種文件打開的方式:
with open('a.txt') as f, open('b.txt', 'w') as f2: # 不用手動關閉 ,可以同時打開兩個文件
for line in f:
print('每次循環的內容是',line) #一行行的讀
#結合案例:
# 找到日志文件log中超過20次的ip地址(安全漏洞的設置,1分鍾讀取數據1次,循環讀取,找到高危ip地址)
# 打開文件
# 依次讀取文件的每行
# 取到每行的ip地址 split
# 獲取到的ip值存放字典,存放次數{'ip1':1,'ip2':2,'ip3'} ip 是key,次數是value
# 循環字典,如果val 大於20,那么就輸出來
# 每分鍾監控上述內容
import time
point=0
while True: #一直循環
with open('access.log', encoding='utf-8') as f: # 當前狀態下的文件內容
f.seek(point)
ips = {}
for line in f:
ip = line.split()[0] # 取到ip地址 不填寫值,默認是空的情況下分隔1
if ip not in ips: # 判斷ip是否出現過,沒有出現過ip的次數就是1
ips[ip] = 1
else: # 出現過的話,次數在原來的基礎上+1
ips[ip] += 1
point=f.tell() #獲取當前讀的位置記錄下,下次從該位置再次讀
for k, v in ips.items():
if v >= 20:
print('有問題的ip地址是%s' % k)
time.sleep(60) #等待一分鍾