解析多个循环打开文件

时间:2016-09-06 00:14:44

标签: python python-2.7

我试图计算一个看起来像这样的文件所包含的行数:

-StartACheck
---Lines--
-EndACheck
-StartBCheck
---Lines--
-EndBCheck

用这个:

count=0
z={}
for line in file:
      s=re.search(r'\-+Start([A-Za-z0-9]+)Check',line)
      if s:
           e=s.group(1)
           for line in file:
               z.setdefault(e,[]).append(count)
               q=re.search(r'\-+End',line)
               if q:
                   count=0
                   break

for a,b in z.items():
    print(a,len(b))

我想基本上将ACheck,BCheck等中存在的行数存储在字典中但是我一直得到错误的输出

像这样的东西

A,15
B,9

我发现尽管代码应该可行,但由于文件的打开方式,它并不存在。我无法改变它的打开方式,并且正在寻找一个只打开文件一次的实现,但是计算相同的内容并提供完全相同的输出,而不需要更新的python版本的所有附加功能。

1 个答案:

答案 0 :(得分:0)

可以使用finite state machine解决此类问题。这是一个复杂的问题,需要比我在这里写的更多的解释。您应该仔细研究它以进一步了解您可以用它做什么。

但首先,我要做一些假设:

  • 输入文件没有任何错误
  • 如果您有多个具有相同名称的部分,则希望将其计数合并
  • 即使你已经标记了这个问题python 2.7,因为你正在使用print(),我猜你正在使用python 3.x

这是我的建议:

import re

input_filename = "/home/evens/Temporaire/StackOverflow/Input_file-39339007.txt"

matchers = {
    'start_section' : re.compile(r'\-+Start([A-Za-z0-9]+)Check'),
    'end_section' : re.compile(r'\-+End'),
    }

inside_section = False          # Am I inside a section ?
section_name = None             # Which section am I in ?
tally = {}                      # Sums of each section

with open(input_filename) as file_read:
    for line in file_read:

        line_matches = {k: v.match(line) for (k, v) in matchers.items()}

        if inside_section:
            if line_matches['end_section']:
                future_inside_section = False
            else:
                future_inside_section = True
                if section_name in tally:
                    tally[section_name] += 1
                else:
                    tally[section_name] = 1
        else:
            if line_matches['start_section']:
                future_inside_section = True
                section_name = line_matches['start_section'].group(1)

        # Just before we go in the future
        inside_section = future_inside_section   

for (a,b) in tally.items():
    print('Total of all "{}" sections: {}'.format(a, b))

此代码的作用是:

  • 它应该如何改变它的状态(我会在下一行的某个部分内部还是外部?)
  • 还应该做​​些什么:
    • 更改我所在的部分的名称?
    • 在本节中计算这一行?

但即使这段代码也存在问题:

  • 它不会检查某个部分的开头是否有匹配的部分结尾(-StartACheck可以-EndATotallyInvalidCheck结束)
  • 它不处理检测到两个连续部分开始(或结束)的情况(错误?嵌套部分?)
  • 它不处理区域外有线的情况
  • 可能是其他角落案件。

您希望如何处理这些案件取决于您

这段代码可能会进一步简化,但我现在不想太复杂。

希望这会有所帮助。不要犹豫,询问您是否需要进一步解释。