我想知道解析文本文件最有效的方法是什么。例如,假设我有以下文本文件:
连接服务器数为:1
服务器状态为:活动
与服务器的连接数为:4
服务器状态为:活动
服务器无响应:13:25:03
服务器连接已建立:13:27:05
我想做的是浏览文件并收集信息。例如,与服务器的连接数或服务器关闭的时间。我想将这些值保存在列表中,以便以后可以查看或绘制它们。
那么,假设我的关键字在列表中,执行此操作的最佳方法是什么,如下所示:
referenceLines = ['connections server', 'Server status', 'not responding']
请注意,我在列表中没有完整的句子,而只有其中的一部分。我想逐行浏览文件,并检查读取行是否对应于 referenceLines 列表中的任何条目,如果是,则获取列表条目的索引并调用相应的函数。
最有效的(时间,内存(方法是什么,因为典型的文本文件的大小约为50MB。
谢谢。
任何
如果每一行都用 ": " 分隔,则可以拆分字符串。
message, value = line.split(': ', 1)
作为一种实用的方法,我建议您分一系列步骤实现这一点,同时测量每个步骤的性能,以衡量用于测试数据的方法的成本。
例如:
- 只需逐行读取文件需要多长时间?
- 如果每行拆分((需要多长时间?
- 如果在每行上运行 re.match(( 需要多长时间?
最佳解决方案将取决于您的数据,例如,您使用了多少条参考线,但在现代机器上应该只需要几秒钟
如果您要解析的文本文件始终包含相同顺序的相同字段,那么 mikerobi 的解决方案很好。否则,您需要遍历这些线并尝试检测参考线...
这是一种可能的方法。它使用表单'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)