Skip to main content
 首页 » 编程设计

python之通过正则表达式 python 解析大文件的最佳方法

2024年11月01日30freeliver54

我必须在 python 中使用 reg ex 解析一个大日志文件 (2GB)。在日志文件中,正则表达式匹配我感兴趣的行。日志文件也可能包含不需要的数据。

这是文件中的示例:

"#DEBUG:: BFM [L4] 5.4401e+08ps MSG DIR:TX SCB_CB TYPE:DATA_REQ CPortID:'h8 SIZE:'d20 NumSeg:'h0001 Msg_Id:'h00000000" 

我的正则表达式是 ".DEBUG.*MSG."

首先,我将使用空格拆分它,然后将“field:value”模式插入到 sqlite3 数据库中;但对于大文件,解析文件大约需要 10 到 15 分钟。

请建议在最短时间内完成上述任务的最佳方法。

请您参考如下方法:

正如其他人所说,分析您的代码以了解它为何缓慢。 cProfile 模块 in conjunction with the gprof2dot tool可以产生很好的可读信息

没有看到你的慢代码,我可以猜测一些可能有帮助的事情:

首先,您可能可以使用内置字符串方法而不是正则表达式 - 这可能会稍微快一些。如果您需要使用正则表达式,值得在主循环外使用 re.compile 进行预编译。

其次是不要每行执行一个插入查询,而是分批执行插入,例如将解析的信息添加到列表中,然后当它达到一定大小时,执行一个插入查询 executemany方法。

一些不完整的代码,如上面的例子:

import fileinput 
 
parsed_info = [] 
for linenum, line in enumerate(fileinput.input()): 
    if not line.startswith("#DEBUG"): 
        continue # Skip line 
 
    msg = line.partition("MSG")[1] # Get everything after MSG 
    words = msg.split() # Split on words 
    info = {} 
    for w in words: 
        k, _, v = w.partition(":") # Split each word on first : 
        info[k] = v 
 
    parsed_info.append(info) 
 
    if linenum % 10000 == 0: # Or maybe  if len(parsed_info) > 500: 
        # Insert everything in parsed_info to database 
        ... 
        parsed_info = [] # Clear