【发布时间】:2014-04-02 03:25:18
【问题描述】:
我正在为特定类型的文件开发解析器,该文件由一些标题关键字分解为多个部分,然后是一堆异构数据。标题总是用空行分隔。大致如下:
Header_A
1 1.02345
2 2.97959
...
Header_B
1 5.1700 10.2500
2 5.0660 10.5000
...
每个标题都包含非常不同类型的数据,并且根据块中的某些关键字,数据必须存储在不同的位置。我采用的一般方法是使用一些正则表达式来捕获所有可以定义标题的关键字,然后遍历文件中的行。找到匹配项后,我会弹出行,直到到达空白行,将行中的所有数据存储在适当的位置。
这是代码的基本结构,其中“使用 current_line 执行操作”将涉及一堆分支,具体取决于行包含的内容:
headers = re.compile(r"""
((?P<header_a>Header_A)
|
(?P<header_b>Header_B))
""", re.VERBOSE)
i = 0
while i < len(data_lines):
match = header.match(data_lines[i])
if match:
if match.group('header_a'):
data_lines.pop(i)
data_lines.pop(i)
# not end of file not blank line
while i < len(data_lines) and data_lines[i].strip():
current_line = data_lines.pop(i)
# do stuff with current_line
elif match.group('header_b'):
data_lines.pop(i)
data_lines.pop(i)
while i < len(data_lines) and data_lines[i].strip():
current_line = data_lines.pop(i)
# do stuff with current_line
else:
i += 1
else:
i += 1
一切正常,但它相当于一个高度分支的结构,我发现它非常难以辨认,对于不熟悉代码的人来说可能很难理解。这也使得将行保持在
我正在做的一件事是将每个标题的分支分成单独的函数。这有望大大提高可读性,但是...
...有没有更简洁的方法来执行外部循环/匹配结构?也许使用 itertools?
此外,由于各种原因,此代码必须能够在 2.7 中运行。
【问题讨论】:
-
+1 用于分解出单独的函数。
-
请注意,
data_lines.pop(i)可能不会按照您的意愿行事。它从data_lines中删除ith行。它一般不会删除data_lines中的第一行。 -
是的,非常正确,但代码绝对可以正常工作。这是一个旧项目,我要重新开始,我想重构/重组一些东西。
标签: python loops python-2.7 iterator