python - 设计一个解析文本文件的模块

标签 python text-parsing

我真的不再相信通用文本文件解析器了——尤其是那些文件是为人类读者准备的。 Beautiful Soap 或 Regular Expression 可以很好地处理 HTML 和 web 日志等文件。但是人类可读的文本文件仍然是一个棘手的问题。

只是我愿意手工编写一个文本文件解析器,定制我会遇到的每一种不同格式。我仍然想看看是否有可能以我在 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)如何分支到相关功能。例如,我可以像这样编写每一行解析器:

def parse_as(s):
    return s.split(' ')[2], s.split(' ')[2] # returning the second same as the first for the case that only one time stamp is found

def parse_between(s):
    return s.split(' ')[2], s.split(' ')[4]

def parse_during(s):
    return s.split(' ')[4], s.split(' ')[6]

这可以帮助我快速了解程序已经处理的格式。我随时可以添加新功能,以防遇到另一种新格式。

但是,我仍然没有一个优雅的方式来分支到相关功能。

# open file
for l in f.readline():
    s = l.split(' ')
    if s == 'As': 
       ts1, ts2 = parse_as(l)
    else:
       if s == 'Between':
          ts1, ts2 = parse_between(l)
       else:
          if s == 'During':
             ts1, ts2 = parse_during(l)
          else:
             print 'error!'
    # process ts1 and ts2

那不是我想要维护的东西。

有什么建议吗?曾经我认为装饰器可能会有所帮助,但我自己无法解决。如果有人能指出我正确的方向,我将不胜感激。

最佳答案

考虑使用字典映射:

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

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

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

for l in f.readline():
    s = l.split(' ')
    p = dmap.get(s, None)
    if p is None:
        print('error')
    else:
        ts1, ts2 = p(l)
        #continue to process

更容易维护。如果你有新的功能,你只需要将它和它的关键字一起添加到dmap中:

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

关于python - 设计一个解析文本文件的模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36650304/

相关文章:

Python - 将目录结构表示为 JSON 并读取每个文件的内容

python - 运行时之前的 SimpleParse 非确定性语法

r - 在 R 中解析 "continent/country/city"向量的快速方法

android - 如何将文本文件中的数据插入android中的sql数据库?

python - 使用 python 将 bibtex 文件转换为 html(也许是 pybtex?)

在本地运行时抛出 python-logstash 错误

python - 通过 PRESTO 连接器选择随机数据样本

python - 如何精确求解具有大整数系数(超过整数)的二次方程?

python - Pyqt 小部件FigureCanvas 边框和内容共存

java - 读取 Java 中的配置,JSON 是一个选项吗?