我编写了这个函数,它输出以下类型的帧序列的范围。
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)
首先,尝试按逻辑步骤划分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