2017-09-01 100 views
0

我已經寫了這個函數,它輸出以下類型的幀序列的範圍。獲取序列的範圍

frme.info.03.bmp 
frme01_0040.bmp 
frme01_0042.bmp 
frme01_0043.bmp 
frme02_0044.bmp 
frme02_0045.bmp 
frme02_0046.bmp 
frme02_0047.bmp 
frme03_0652.raw 
frme03_0653.raw 
frme03_0654.raw 
frme03_0656.raw 
frme03_0659.raw 
frme1.45.dat 
frme2.45.dat 
frme3.45.dat 
frme4.45.dat 

和功能我寫的是:

def getRange(self, sequence, sep="_"): 
    frameNumbers = [] 
    for item in sequence: 
     frameNumbers.append(int(os.path.splitext(item)[0].split(sep)[-1])) 
    return FrameRange(frameNumbers) 

但是這給了錯誤:ValueError: invalid literal for int() with base 10: 'pe67'

,如果我有這種類型的幀序列:

pe67.0140 
pe67.0141 

我應該如何處理上述所有情況?

+0

使用正則表達式? –

+0

那也可以吧 –

+0

檢查擴展是否是原始代碼之前的數字 –

回答

0

首先,嘗試按邏輯步驟劃分刺痛的處理。它不一定全在一行。尤其適用於調試。

def getRange(sequence, sep="_"): 
    frameNumbers = [] 
    for item in sequence: 
     filename = os.path.splitext(item)[0] 
     filename_parts = filename.split(sep) 
     number_from_filename = filename_parts[-1] 
     number = int(number_from_filename) 
     frameNumbers.append(number) 
    return frameNumbers 

你的代碼產生:

('frme.info.03', '.bmp') 
'frme.info.03' 
'frme.info.03' # (there is no _ to split at) 

而且它會嘗試將該值轉換成int。

+0

怎麼弄清楚分隔符是什麼,因爲在第一種情況下'_'是分隔符,但在後面的情況下''。是分隔符。 –

0

一種方法是使用RegEx。以._之後的每個數字後跟另一個.

r = re.compile('(?:[._]+)([\d]+)') 
for filename in filenames: 
    search_result = re.search(r, filename) 
    if not search_result is None: 
     print(search_result.group(1)) 
    else: 
     print('no match could be found') 

,或者你只是走了暴力破解向後走數字的第一個連續範圍:

digits = [str(i) for i in range(0, 10)] 
for filename in filenames: 
    base_name = os.path.splitext(filename)[0] 
    frame = '' 
    for b in base_name[::-1]: 
     if b in digits: 
      frame = b + frame 
     elif frame: 
      print(frame) 
      break 

兩個給你同樣的輸出:

03 
0040 
0042 
0043 
0044 
0045 
0046 
0047 
0652 
0653 
0654 
0656 
0659 
45 
45 
45 
45 
+0

您忽略了文件序列可以是pe67.0140類型的情況 - pe67.0141導致AttributeError:NoneType對象沒有屬性'group''錯誤,所以我相信我們需要對這種情況有不同的正則表達式 –

+0

感謝您的評論!我相應地調整了代碼。 'pe67.0140'是沒有文件類型的文件名嗎?請將信息添加到您的問題。 –