簡體   English   中英

在Python中解析文件的最有效方法

[英]Most efficient way to parse a file in Python

我想知道最有效的方法是解析文本文件。 例如,假設我有以下文本文件:

連接服務器數為:1

服務器狀態為:ACTIVE

與服務器的連接數為:4

服務器狀態為:ACTIVE

服務器沒有響應:13:25:03

建立服務器連接:13:27:05

我要做的是瀏覽文件並收集信息。 例如,與服務器的連接數或服務器宕機的時間。 我想將這些值保存在列表中,以便以后查看或繪制它們。

那么,假設我將關鍵字放在如下列表中,執行此操作的最佳方法是什么:

referenceLines = ['connections server', 'Server status', 'not responding']

請注意,列表中沒有完整的句子,只有一部分。 我想逐行瀏覽文件,並檢查讀取的行是否對應於referenceLines列表中的任何條目,如果是,則獲取列表條目的索引並調用相應的函數。

這將是最有效的方式(時間,內存),因為典型的文本文件大小約為50MB。

謝謝。

任何

如果每一行都用“:”分隔,則可以分割字符串。

message, value = line.split(': ', 1)

作為一種實用的方法,我建議您在一系列步驟中實施此步驟,同時在每個步驟中評估性能,以評估用於測試數據的方法的成本。

例如:

  • 簡單地逐行讀取文件需要多長時間?
  • 每行split()多長時間?
  • 如果每行運行re.match()多長時間?

最佳解決方案將取決於您的數據,例如,您正在使用多少參考線,但是在現代機器上只需幾秒鍾

如果您要解析的文本文件始終包含相同順序的相同字段,那么mikerobi的解決方案是不錯的選擇。 否則,您需要遍歷各行並嘗試檢測referenceLines ...

這是一種可能的方法。 它使用形式為'keyword1|keyword2'的正則表達式模式來一次搜索多個關鍵字。

def func1(line):
    #do something

def func2(line):
    #do something

actions = {'connections server': func1,
           'Server status': func2}

regex = re.compile('|'.join(re.escape(key) for key in actions))

for line in file:
    for matchobj in regex.finditer(line):
        actions[matchobj.group()](line)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM