得到序列的范围

时间:2017-09-01 15:31:28

标签: python python-2.7

我编写了这个函数,它输出以下类型的帧序列的范围。

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

我应该如何处理上述所有情况?

2 个答案:

答案 0 :(得分:0)

首先,尝试按逻辑步骤划分sting的处理。它并不一定都在一条线上。特别是对于调试。

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。

答案 1 :(得分: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')

或者你只是向后走bruteforce并取第一个连续的数字范围:

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