python 自動化運維之大文件讀取

一、 文件操作簡介

文件操作的基本流程:

獲取文件句柄
打開文件
通過句柄對文件操作
關閉文件
file=open("a.txt")  # 打開文件,得到一個文件句柄,並賦值給一個變量
print(f.read())     # 輸出文件的內容
f.close()           # 關閉文件 

mode 常用參數:
mode參數
注意

  1. 默認的打開方式是’rt’(mode=‘rt’);Python是區分二進制方式和文本方式的,當以二進制方式打開一個文件時(mode參數後面跟’b’),返回一個未經解碼的字節對象;當以文本方式打開文件時(默認是以文本方式打開,也可以mode參數後面跟’t’),返回一個按系統默認編碼或參數encoding傳入的編碼來解碼的字符串對象;
  2. 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()

可以根據自己需求進行二次開發;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章