2015-09-01 50 views
-1

我正在寫一個腳本來檢查文件列表中的圖像序列。到目前爲止它運行得很好,但由於某種原因它總是跳過每個新序列的第一個文件。這是到目前爲止我的代碼:python圖像序列循環問題

import os, re 
filelist = ["A01B02_0123_A333..ari", "A01B02_0123_A333..ari", "A01B02_0123_A333..ari", "A01B02_0123_A333..ari", "A01B02_0123_A333..ari", "A01B02_0123_A333..ari", "A01B02_0123_A333..ari", "A01B02_0123_A333..ari", "A01B02_0123_A333..ari", "A01B02_0123_A333..ari", "A01B02_0123_A333..ari", "A02B03_0123_A444.0052.ari", "bus_v01.1001.tif", "bus_v01.1002.tif", "bus_v01.1003.tif", "bus_v02.1001.tif", "bus_v02.1002.tif", "bus_v02.1003.tif", "elementA_1001.jpg", "elementA_1002.jpg", "elementA_1003.jpg", "elementB_1001.jpg", "elementB_1002.jpg", "elementB_1003.jpg"] 

def digitgroups(file): 
    padding_expr = re.compile("\d+") 
    lastfile = "" 
    sequence_index = 0 

    for file in filelist: 

     if file.endswith((".dpx", ".ari", ".jpg", ".tif")): 
      match = re.findall(padding_expr, file)[::-1] 
      lastmatch = re.findall(padding_expr, lastfile)[::-1] 

      if len(match) == len (lastmatch) and file != lastfile: 

       for i in range (0, len(match)): 
        digit_difference = int(lastmatch[i])-int(match[i]) 

        if not (digit_difference) == 0: 

         if digit_difference == -1 or digit_difference == 1 and os.path.splitext(file)[-1] is os.path.splitext(l)[-1]: 
          print file, "a is part of sequence {0}".format(sequence_index) 
         elif digit_difference < -1 or digit_difference > 1: 
          sequence_index += 1 

         break 

      lastfile = file 

digitgroups(filelist) 
+0

嘗試代碼阻止您的代碼,以便我們可以有效地閱讀。 – taesu

+3

'is'比較對象標識,而'=='比較對象值。你想'file!= lastfile'。 –

+2

'list'是一個內建類型,你重寫它。這是不好的做法。 – Ale

回答

1
從在評論中提到的一切

除此之外,循環依賴於lastfile是不是空白。

在第一遍:

if len(match) == len (lastmatch) and file is not lastfile: 

不會在第一輪真正的,因爲lastfile設置爲""len(lastmatch)0

此外,您正在傳入list,然後在該函數中調用file。 下面的解決方案爲我(編輯,更完整的解決方案):

import os, re 
mylist = ["A01B02_0123_A333..ari", "A01B02_0123_A333..ari", "A01B02_0123_A333..ari", "A01B02_0123_A333..ari", "A01B02_0123_A333..ari", "A01B02_0123_A333..ari", "A01B02_0123_A333..ari", "A01B02_0123_A333..ari", "A01B02_0123_A333..ari", "A01B02_0123_A333..ari", "A01B02_0123_A333..ari", "A02B03_0123_A444.0052.ari", "bus_v01.1001.tif", "bus_v01.1002.tif", "bus_v01.1003.tif", "bus_v02.1001.tif", "bus_v02.1002.tif", "bus_v02.1003.tif", "elementA_1001.jpg", "elementA_1002.jpg", "elementA_1003.jpg", "elementB_1001.jpg", "elementB_1002.jpg", "elementB_1003.jpg"] 

def digitgroups(files): 
    padding_expr = re.compile("\d+") 
    lastfile = "" 
    sequence_index = 0 

    for f in files: 
     if f.endswith((".dpx", ".ari", ".jpg", ".tif")): 
      match = re.findall(padding_expr, f)[::-1] 
      lastmatch = re.findall(padding_expr, lastfile)[::-1] 

      if len(match) == len(lastmatch) and f is not lastfile: 
       for i in range (0, len(match)): 
        digit_difference = int(lastmatch[i])-int(match[i]) 
        if not digit_difference == 0: 
         if digit_difference == -1 or digit_difference == 1 and os.path.splitext(f)[-1] is os.path.splitext(l)[-1]: 
          print(f, "a is part of sequence {0}".format(sequence_index)) 
         elif digit_difference < -1 or digit_difference > 1: 
          sequence_index += 1 

         break 
      else: 
       print(f, "a is part of sequence {0}".format(sequence_index)) 
      lastfile = f 

digitgroups(mylist) 

通知的lastfile = files.pop(0)。這將獲得files列表中的第一個元素。

+0

謝謝您的詳細解答!這解決了我的問題的一部分 - >不僅我的列表中的第一個文件被刪除,這發生在新序列的每個第一個文件;例如。 「elementB_1001.jpg」,「bus_v01.1001.tif」等 – nuki

+1

那是因爲'if len(match)== len(lastmatch)...'line再次。每次序列更改都很可能是錯誤的。因此,序列中的第一個文件不會被打印,然後該文件被放入,作爲「lastfile」並且序列的其餘部分匹配。 – chadgh

+1

我想你想看看爲'if'添加'else'。如果它不匹配,則認爲它是序列中的第一個。或者類似的東西 – chadgh