设计一个文本fi解析模块

2024-04-30 00:43:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我真的不相信通用的文本文件解析器-特别是那些文件是为人类读者准备的。像HTML和weblog这样的文件可以用漂亮的Soap或正则表达式很好地处理。但是人类可读的文本文件仍然是一个难以破解的难题。在

只是我愿意手工编写一个文本文件解析器,对我遇到的每种不同格式进行裁剪。我仍然想看看是否有可能有一个更好的程序结构,我仍然能够理解3个月后的程序逻辑。也是为了让它可读。在

今天我遇到了一个从文件中提取时间戳的问题:

"As of 12:30:45, ..."
"Between 1:12:00 and 3:10:45, ..."
"During this time from 3:44:50 to 4:20:55 we have ..."

解析很简单。我在每一行的不同位置都有时间戳。但我认为我应该如何设计模块/函数,以:(1)每行格式将被单独处理,(2)如何分支到相关函数。例如,我可以对每行解析器进行如下编码:

^{pr2}$

这可以帮助我快速了解程序已经处理的格式。我总是可以添加新函数,以防遇到其他新格式。在

但是,我仍然没有一个优雅的方法来分支到相关的函数。在

^{3}$

这不是我想维持的。在

有什么建议吗?有一次,我以为装修师会帮上忙,但我自己解决不了。如果有人能给我指出正确的方向,我会很感激。在


Tags: 文件函数解析器html格式分支时间人类
3条回答

为什么不使用正则表达式呢?在

import re

# open file
with open('datafile.txt') as f:
    for line in f:
        ts_vals = re.findall(r'(\d+:\d\d:\d\d)', line)
        # process ts1 and ts2

因此,ts_vals将是一个包含一个或两个元素的列表。在

怎么办

start_with = ["As", "Between", "During"]
parsers = [parse_as, parse_between, parse_during]


for l in f.readlines():
    match_found = False

    for start, f in zip(start_with, parsers):
        if l.startswith(start):
            ts1, ts2 = f(l.split(' '))
            match_found = True
            break

    if not match_found:
        raise NotImplementedError('Not found!')

或者有一句名言,如伊恩所述:

^{pr2}$

考虑使用字典映射:

dmap = {
    'As': parse_as,
    'Between': parse_between,
    'During': parse_during
}

那么你只需要这样使用它:

^{pr2}$

更容易维护。如果有新函数,只需将其与关键字一起添加到dmap中:

dmap = {
    'As': parse_as,
    'Between': parse_between,
    'During': parse_during,
    'After': parse_after,
    'Before': parse_before
    #and so on
}

相关问题 更多 >