繁体   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