python 自動化運維之大文件讀取
一、 文件操作簡介
文件操作的基本流程:
file=open("a.txt") # 打開文件,得到一個文件句柄,並賦值給一個變量
print(f.read()) # 輸出文件的內容
f.close() # 關閉文件
mode 常用參數:
注意
- 默認的打開方式是’rt’(mode=‘rt’);Python是區分二進制方式和文本方式的,當以二進制方式打開一個文件時(mode參數後面跟’b’),返回一個未經解碼的字節對象;當以文本方式打開文件時(默認是以文本方式打開,也可以mode參數後面跟’t’),返回一個按系統默認編碼或參數encoding傳入的編碼來解碼的字符串對象;
- buffering是一個可選的參數,buffering=0表示關閉緩衝區(僅在二進制方式打開時可用);buffering=1表示選擇行緩衝區(僅在文本方式打開時可用);buffering大於1時,其值代表固定大小的塊緩衝區的大小。當不指定該參數時,默認的緩衝策略是這樣的:二進制文件使用固定大小的塊緩衝區,文本文件使用行緩衝區.
二、大文件讀取
當文件較小時,我們可以一次性全部讀取到內存中,對文件操作後,再保存至磁盤(持久化),這樣速度很快;
1. 讀取小文件並操作
with open('a.txt') as read_f, open('.a.txt.swap','w') as write_f:
data=read_f.read() # 讀取所有數據到內存
data=data.replace('str1','str2') # 對字符串進行替換操作
write_f.write(data) # 一次性寫入文件
os.remove('a.txt') #刪除源文件
os.rename('.a.txt.swap','a.txt') # 重命名修改後的文件
2. 大文件讀取
當文件很大時,如GB級的文本文件,一次性讀取全部數據到內存中將會導致運行非常緩慢,此時我們可以通過可迭代方式(部分讀取)將文件的內容逐行(指定大小)讀入內存,在逐行寫入新文件,然後用新文件覆蓋源文件;
with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
for line in read_f: # 逐行讀取操作,防止文件過大內存溢出
line=line.replace('str2','str1') # 在內存中修改數據
write_f.write(line) # 將所有數據寫入文件
os.remove('a.txt')
os.rename('.a.txt.swap','a.txt')
3. 其他處理大數據的方法
1. 通過read(size),指定讀取的字節數。
while True:
block=f.read(1024)
if not block:
break
2. 通過readline(),每次讀取一行。
while True:
line=f.readline()
if not line:
break
3. 更多file 對象操作函數。
完整大文件處理代碼:
# encoding= utf-8
import os
import time
# 適合GB級別的文件讀取
def readLine():
with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
for line in read_f:
# line=line.replace('str2','str1') # 在內存中修改數據
line=line.replace('str2','str1') # 在內存中修改數據
write_f.write(line) # 將所有數據寫入文件
os.remove('a.txt')
os.rename('.a.txt.swap','a.txt')
# 適合小文件讀取
def readAll():
with open('a.txt') as read_f, open('.a.txt.swap','w') as write_f:
start=time.time()
data=read_f.read() # 讀取所有數據到內存
data=data.replace('str1','str2') # 對字符串進行替換操作
write_f.write(data) # 一次性寫入文件
print(time.time()-start)
os.remove('a.txt')
os.rename('.a.txt.swap','a.txt')
if __name__ == "__main__":
readAll()
readLine()
可以根據自己需求進行二次開發;