在工作中,我們常會遇到一個很大的文件(通常為log文件),當出現問題的時候,我們想使用程序來處理日志文件來對問題進行分析。一般可以使用shell腳本等來處理,有時候也會用一些腳本語言(比如:python)來對日志進行處理。一般程序都需要將待處理的文件載入內存,然后才進行處理,這種方式需要很大的內存資源。但一般使用的機器沒有這么大的內存,那又如何處理呢?
針對python對文件的處理,一般有read、readline、readlines三種讀取文件的方法。調用read()會一次性讀取文件的全部內容,如果文件太大,內存就會超載,對于大內存可以反復調用read(size)方法,每次最多讀取size個字節的內容。另外,調用readline()可以每次讀取一行內容,調用readlines()一次讀取所有內容并按行返回list。
以下就是使用Python腳本語言對大文件進行處理常使用的方法。
方法一 使用with語句
with 語句的語法格式
with context_expression [as target(s)]:
with-body
這里 context_expression 要返回一個上下文管理器對象,該對象并不賦值給 as 子句中的 target(s) ,如果指定了 as 子句的話,會將上下文管理器的 enter() 方法的返回值賦值給 target(s)。target(s) 可以是單個變量,或者由“()”括起來的元組(不能是僅僅由“,”分隔的變量列表,必須加“()”)。
測試
# 每讀取一萬數據打印一次行號
def read_data(file_path):
index = 0
with open(file_path) as lines:
for line in lines:
index = index + 1
if index % 10000 == 0:
print index
方法二
將文件分割處理后讀取,每當讀取一個后關閉并讀取另外一個。