虽然在文本文件搜索中不存在列表条目时循环不进行

时间:2014-07-01 11:34:23

标签: python

我希望有人可以对我的循环问题有所了解。为长篇解释道歉!

基本上我有一个收集各种统计数据的脚本,但也收集'框架'数字并将它们从一个巨大的文本文件中放入'framelist []',一旦收集到帧编号,脚本继续执行新的搜索相同的文本文件来搜索这些帧编号并提取一些更有用的信息。它有点过于复杂,但我不得不这样做,因为第二个搜索根据文本文件中的字符串的第一次搜索收集一些新的统计数据。同时我使用xlsxwriter将收集的统计信息发布到Excel并执行通常的行+ = 1来添加统计信息。到目前为止它仍然有效,但它变得更加复杂。

接下来我要做的是将framelist转换为'ints'并从所有framelist条目中扣除1,然后转换回新的字符串'framelist1 []'列表,其中包含新条目(减去'1')。我这样做是为了找到前面的帧号。然后我运行另一个搜索来收集前一帧编号的类似统计信息。到目前为止一切正常....直到找不到“减去的”帧数。如果文本文件中没有新的“减去”框架,则python scipt会挂起。我想要做的是忽略一个丢失的框架,如果文本文件中没有它,只需在Excel文件中放入一个“空”或“跳过”条目。我玩了各种尝试:除了:功能,但仍然没有运气,脚本仍然挂起。我在处理framelist1 []时发布了我的while循环。我在代码中留下了“Skip”和“Null”尝试,以显示到目前为止我尝试过的内容。为复杂的方法道歉,我还在学习Python,而且我知道通过避免多次搜索有一种更好的方式来做到这一点,但是这样做我知道我在脚本中出现错误时的行踪!

这是循环...

        framelist = map(int, framelist)
        framelist[:] = [x - 1 for x in framelist]

        framelist1 = map(lambda x: str(x), framelist)
        framelist = []
        #framelist1 = ''(str(e) for e in framelist)

        num = 0

        while num < len(framelist1):
            for i, line in enumerate(searchlinesBMA):
                try:
                    word = framelist1[num]
                    print word
                    if word in line:
                        keylineBMA = searchlinesBMA[i-2]
                        Rline = searchlinesBMA[i+10]
                        Rline = re.sub('[()]', '', Rline)
                        valueR = Rline.split()
                        split = keylineBMA.split()
                        try:
                            if split[10] == 'A':
                                worksheetFILTERA.write(row_numBMAA1,4,valueR[3], decimal_format)
                                row_numBMAA1+=1
                                num+=1
                        except:
                            worksheetFILTERA.write(row_numBMAA1,4,'SKIP')
                            row_numBMAA1+=1
                            num+=1
                            break
                    elif word != framelist1[num]:
                        worksheetFILTERA.write(row_numBMAA1,4,'NULL')
                        row_numBMAA1+=1
                        num+=1
                        break
                except:
                    pass

谢谢, MikG

1 个答案:

答案 0 :(得分:1)

您没有在示例底部的num语句中递增except。因此,如果它在try块的开始处出错,那么您将拥有一个无限循环。

如果num中没有任何内容,您就不会递增searchlinesBMA

while num < len(framelist1):
    # if searchlinesBMA is empty here you dont increment `num`
    for i, line in enumerate(searchlinesBMA):
         #Your code..

    #increment num needed here?
    if not searchlinesBMA:
        num += 1
    else:
        for i, line in enumerate(searchlinesBMA):
            # Your code..

可能值得打印错误捕获的错误。可能会让你更好地了解错误:

except Exception as e:
    print(e)