總結內容:app
一、文件的基本操做步驟ide
二、文件的打開方式函數
三、操做文件用到的方法編碼
四、練習url
1、文件的基本操做步驟spa
一、找到操做的文件(若是在同一目錄下使用相對路徑;若是不在相同目錄下要使用絕對路徑)指針
二、打開文件日誌
三、操做文件進行讀寫code
四、關閉文件對象
2、文件的打開方式
一、open()方法
open() 方法用於打開一個文件,並返回文件對象,在對文件進行處理過程都須要使用到這個函數,若是該文件沒法被打開,會拋出 OSError。
格式:open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
參數說明:
file: 必需,文件路徑(相對或者絕對路徑)。
mode: 可選,文件打開模式
buffering: 設置緩衝
encoding: 通常使用utf8
errors: 報錯級別
newline: 區分換行符
closefd: 傳入的file參數類型
opener:
說明:使用open方式打開文件,最後必定要記得使用close方法關閉文件
1 #打開test.txt文件 2 f = open('test.txt') #test.txt文件同py文件在同一目錄下 3 print(f.read()) #讀取文件中的全部內容 4 f.close() #關閉文件
二、使用with方式打開文件,使用該方式打開文件後,會自動關閉打開的文件
格式:with open(文件,操做方式) as 文件別名:
操做文件主體
with open('test.txt','a') as f: #以最近方式對文件進行操做 f.write('test11') #往文件中寫入數據
3、操做文件用到的方法
說明:文件操做的模式包括:讀、寫、追加三種模式,默認讀模式
r:以只讀方式打開文件。文件的指針將會放在文件的開頭。這是默認模式;若是文件不存在,程序將會報錯
rb:以二進制格式打開一個文件用於只讀。文件指針將會放在文件的開頭。這是默認模式。通常用於非文本文件如圖片等
r+:打開一個文件用於讀寫。文件指針將會放在文件的開頭。打開不存在的文件,程序報錯;能夠寫入內容可是寫入的內容會從文件的頂部開始覆蓋原文件
w:打開一個文件只用於寫入。若是該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。若是該文件不存在,建立新文件。
wb:以二進制格式打開一個文件只用於寫入。若是該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。若是該文件不存在,建立新文件。通常用於非文本文件如圖片等。
w+:打開一個文件用於讀寫。若是該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。若是該文件不存在,建立新文件。能夠寫入內容,可是因爲會清空內容,因此返回值都是空
a:打開一個文件用於追加。若是該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容以後。若是該文件不存在,建立新文件進行寫入。
ab:以二進制格式打開一個文件用於追加。若是該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容以後。若是該文件不存在,建立新文件進行寫入。
a+:打開一個文件用於讀寫。若是該文件已存在,文件指針將會放在文件的結尾。文件打開時會是追加模式。若是該文件不存在,建立新文件用於讀寫。經常使用模式,既能夠讀文件也能夠寫文件
一、讀文件的方法
read()方法:讀取文件中的全部內容,以字符串的方式進行展現。
f = open('test.txt','r+') res = f.read() print(res) f.close() 運行結果: test11
readline()方法:獲取文件中的每一行的內容,以字符串形式展現
1 f = open('test.txt') 2 print(f.readline()) #打印第一行內容 3 print(f.readline()) #打印第二行內容 4 f.close() 5 6 運行結果: 7 test11 8 test12
readlines()方法:獲取文件中全部的內容,以字符的形式展現
1 f = open('test.txt') 2 print(f.readlines()) #讀取全部內容 3 f.close() 4 5 運行結果: 6 ['test11\n', 'test12\n', 'test13\n', 'test14\n', 'test15\n']
二、寫文件方法
write()方法:向文件中寫入指定字符串
1 f = open('test.txt','w') 2 f.write('test16') 3 f.close() 4 f = open('test.txt') 5 print(f.read()) 6 f.close() 7 8 運行結果: 9 test16
writelines()方法:向文件中寫入一序列的字符串
1 a = ['list1\n','list2\n','list3\n'] 2 f = open('test.txt','w') 3 f.writelines(a) 4 f.close() 5 f = open('test.txt') 6 print(f.read()) 7 f.close() 8 9 運行結果: 10 list1 11 list2 12 list3
三、修改文件內容
方式一:
1 f = open('users.txt') 2 res = f.read().replace('test','wyh') 3 f.close() 4 f = open('users.txt','w') 5 f.write(res) 6 f.close()
方式二:
1 f = open('users.txt','a+') 2 f.seek(0) #將文件指針移動文件開始位置 3 res = f.read().replace('test','list') #將文件內容中的test修改成list 4 f.seek(0) 5 f.truncate() #清空文件裏面的內容 6 f.write(res) 7 f.close()
方式三:
1 import os #導入os模塊 2 f = open('users.txt') 3 f2 = open('users.txt.bat','w') 4 for line in f: 5 new_line = line.replace('list','test') #將文件內容中的list修改成test 6 f2.write(new_line) #將修改的內容,添加到文件2中 7 f.close() 8 f2.close() 9 os.remove('users.txt') #刪除原文件 10 os.rename('users.txt.bat','users.txt') #將修改後的問題重命名
四、打開二進制文件並保存
1 import requests #導入requests模塊 2 url = 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1584945092&di=ba5f1891ad196f22cb25394d459780d5&imgtype=jpg&er=1&src=http%3A%2F%2Fi0.hdslb.com%2Fbfs%2Farchive%2F40bbc6dc7f5691d5ee1e4f1aeaa307f4f745ee41.jpg' 3 res = requests.get(url).content #打開URL地址並以二進制形式進行讀取 4 f = open('changba.jpg','wb') #以讀模式打開文件 5 f.write(res) 6 f.close()
五、文件的高效處理
首先處理文件中的內容的流程大概是:CPU-->內存-->磁盤;首先把數據從磁盤中取出並放入到內存中,而後CPU處理的時候直接從內存中讀取。可是內存的大小是有限制的,若是咱們打開一個特別的大的文件,若是一下將全部內容都讀取到內存勢必會給內存帶來很大的壓力,因此處理大文件的時候咱們儘可能是逐行去處理。逐行讀取代碼的示例以下:
1 #使用while循環方式,讀取文件 2 f = open('users.txt',encoding='utf-8') 3 while True: 4 line = f.readline() 5 if line != '': 6 print('line:',line) 7 else: 8 print('end') 9 break 10 f.close() 11 12 #使用for循環方式,讀取文件 13 f = open('users.txt',encoding='utf-8') 14 f.seek(0) 15 for line in f: 16 print(line) 17 f.close()
六、其它方法
seek()方法:肯定文件指針的位置
flush()方法:刷新緩衝區,即當即把緩衝區裏面的內容寫入磁盤
tell()方法:記錄文件指針的當前位置
truncate()方法:清空文件的內容,須要配和指針使用
注意:若是寫入文件報錯的話須要制定字符編碼
4、練習
練習:監控日誌
一、從日誌裏面找到,1分鐘以內超過20次訪問的IP
二、腳本每分鐘運行一次
思路:
一、讀取文件內容,獲取IP地址
二、把每一個IP地址存起來,使用字典存儲(避免重複)
三、判斷IP訪問的次數是否超過20次
四、加入黑名單
1 import time 2 point = 0 3 while True: 4 ips = {} 5 f = open(r'C:\Users\Administrator\Desktop\access.log', encoding='utf-8') #文件前邊加入r表明路徑中的特殊字符不會被轉義 6 f.seek(point) 7 for line in f: 8 ip = line.split()[0] 9 if ip in ips: 10 ips[ip] += 1 11 else: 12 ips[ip] = 1 13 point = f.tell() # 記錄文件指針的位置 14 for ip, count in ips.items(): 15 if count >= 20: 16 print('%s 加入黑名單!' % ip) 17 f.close() 18 time.sleep(60)