【问题标题】:Advice on how I should structure program关于我应该如何构建程序的建议
【发布时间】:2016-09-04 23:12:22
【问题描述】:

对于我正在尝试设计的程序,我正在检查配置文件中是否存在某些条件。例如,该行:ThisExists 在程序中,或者 ThisIsFirst 存在于文件中,然后是 ThisAlsoExists 在文件后面的某个位置.

我寻找了一种可能在这种情况下使用的有效方法,但找不到任何方法。

我目前的想法基本上是每次我想检查一个条件时对文件进行多次迭代。所以我会有功能:

def checkA(文件)

def checkB(文件)

。 . .

对我来说,这似乎效率低下,因为我必须针对要检查的每个条件进行迭代。

最初我以为我可以只迭代一次,检查每一行是否有我想要验证的每个条件。但我认为我不能这样做,因为可能是多行的条件一次需要有关多行的信息。

我概述的方法是实现此目的的唯一方法,还是有更有效的方法?

我试图在下面提供一个示例。

def main():
    file = open(filename)
    result1 = checkA(file)
    result2 = checkB(file)

    """This is a single line check function"""
    def checkA(file)
        conditionExists = False
        for line in file:
            if(line == "SomeCondition"):
                 conditionExists = True
         return conditionExists

    """This is a multi line check function"""
    def checkB(file)
        conditionExists = False
        conditionStarted = False
        for line in file:
             if(line == "Start"):
                 conditionStarted = True
             elif(line == "End" and conditionStarted):
                  conditionExists = True
        return conditionExists

【问题讨论】:

  • 你能给我们举个例子吗?
  • 抱歉,现在编辑我的问题,而不是试图把它放在这里。
  • 基本上我要问的是,如果您必须对文件进行大量解析,您应该将其拆分为多个单独函数的解析,还是尝试在一个复杂函数中进行解析?函数的复杂性是否值得从多轮解析中节省时间?
  • 在大多数情况下,您应该将文件中的数据读入内存中的某个数据结构(Python 对象)中。然后,当您对某事感兴趣时,您应该查询该对象。顺便说一句,Python 有内置库,可以为通常的文件格式执行此操作;请参阅模块 configparser、json、csv。
  • 我会调查的。谢谢。

标签: python parsing


【解决方案1】:

从软件工程的角度来看,您当前的方法具有一些不错的优势。各个功能的逻辑完全解耦,可以单独调试和测试。每个单独功能的复杂性很低。而且这种方法可以让您轻松合并各种不具有并行结构的检查。

【讨论】:

    【解决方案2】:

    如果可用的库(configparser 等)还不够,我可能会使用正则表达式。

    import re
    
    check_a = re.compile('^SomeCondition$', flags=re.MULTILINE)
    check_b = re.compile('^Start(?:.|\n)*?End$', flags=re.MULTILINE)
    
    def main(file_name):
        with open(file_name, 'r') as file_object:
             file_content = file_object.read()
    
        result_1 = bool(check_a.search(file_content))
        result_2 = bool(check_b.search(file_content))
    

    这不是最用户友好的方法——尤其是在匹配条件复杂的情况下——但我认为学习正则表达式的回报是巨大的。

    xkcd 告诉我们正则表达式都可以是super powerproblem

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-10
      • 1970-01-01
      相关资源
      最近更新 更多