python图像序列循环问题

python图像序列循环问题,python,loops,Python,Loops,我正在写一个脚本来检查文件列表中的图像序列。到目前为止,它运行得相当好,但出于某种原因,它总是跳过每个新序列的第一个文件。这是我目前的代码: import os, re filelist = ["A01B02_0123_A333.01234321.ari", "A01B02_0123_A333.01234322.ari", "A01B02_0123_A333.01234323.ari", "A01B02_0123_A333.01234324.ari", "A01B02_0123_A333.012

我正在写一个脚本来检查文件列表中的图像序列。到目前为止,它运行得相当好,但出于某种原因,它总是跳过每个新序列的第一个文件。这是我目前的代码:

import os, re
filelist = ["A01B02_0123_A333.01234321.ari", "A01B02_0123_A333.01234322.ari", "A01B02_0123_A333.01234323.ari", "A01B02_0123_A333.01234324.ari", "A01B02_0123_A333.01234325.ari", "A01B02_0123_A333.01234326.ari", "A01B02_0123_A333.01234327.ari", "A01B02_0123_A333.01234328.ari", "A01B02_0123_A333.01234329.ari", "A01B02_0123_A333.01234330.ari", "A01B02_0123_A333.01234331.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)
导入操作系统,重新
“A01B02布布02布留留留留留留3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 330.ari“,“A01B02_0123_A333.01234331.ari”,“A02B03_0123_A444.0052.ari”,“总线v01.1001.tif”,“总线v01.1002.tif”,“总线v01.1003.tif”,“总线v02.1001.tif”,“总线v02.1002.tif”,“总线v02.1003.tif”,“元素A_1001.jpg”,“元素A_1002.jpg”,“元素A_1003.jpg”,“元素B_1001.jpg”,“元素B”]
def数字组(文件):
padding\u expr=re.compile(“\d+”)
lastfile=“”
序列索引=0
对于文件列表中的文件:
如果文件.endswith((“.dpx”、“.ari”、“.jpg”、“.tif”):
match=re.findall(padding_expr,file)[::-1]
lastmatch=re.findall(padding_expr,lastfile)[::-1]
如果len(match)==len(lastmatch)和file!=lastfile:
对于范围(0,len(匹配))中的i:
数字差=int(最后匹配[i])-int(匹配[i])
如果不是(数字_差)==0:
如果Digital_difference==1或Digital_difference==1且os.path.splitext(文件)[-1]为os.path.splitext(l)[-1]:
打印文件,“a是序列{0}的一部分”。格式(序列索引)
elif数字差<-1或数字差>1:
序列索引+=1
打破
lastfile=file
数字组(文件列表)

除了注释中提到的所有内容外,循环取决于
lastfile
是否为空

第一次通过时:

if len(match) == len (lastmatch) and file is not lastfile:
在第一次传递时将不为true,因为lastfile被设置为
,而
len(lastmatch)
将为
0

另外,您正在传入
list
,然后在函数中调用if
file
。 下面的解决方案对我有效(经过编辑,更完整的解决方案):

导入操作系统,重新
“A01B02-U0123-A333.01233.012343213.33.0123432.A333.012343333.01233333.0123432.32.ari”、“A01B02-U0123-A333.012333.0123.0123.0123.0123.0123.0123.0123.3.3.3.3.3.3.3.2.ari”、“ari”、“ari”、“Ar利”、“亚10 10 10亿布02-布02-02-02-2-U0123.3.3.3.0123.3.3.3.3.0123.0123.0123.3.0123.0123.0123.0123.3.0123.3.3.3.3.3.3.3.0123432.3.3.3.3.3.32.32.32.32.32.32.32.32.32.32.32.2.2.2.2.2.2 330.ari“A01B02_0123_A333.01234331.ari”、“A02B03_0123_A444.0052.ari”、“总线v01.1001.tif”、“总线v01.1002.tif”、“总线v01.1003.tif”、“总线v02.1001.tif”、“总线v02.1002.tif”、“总线v02.1003.tif”、“元素A_1001.jpg”、“元素A_1002.jpg”、“元素A_1003.g”、“元素B_1002.jpg”、“元素B.jpg”]
def数字组(文件):
padding\u expr=re.compile(“\d+”)
lastfile=“”
序列索引=0
对于文件中的f:
如果f.endswith((“.dpx”、“.ari”、“.jpg”、“.tif”):
match=re.findall(padding_expr,f)[::-1]
lastmatch=re.findall(padding_expr,lastfile)[::-1]
如果len(match)=len(lastmatch)且f不是lastfile:
对于范围(0,len(匹配))中的i:
数字差=int(最后匹配[i])-int(匹配[i])
如果不是数字_差==0:
如果Digital_difference==-1或Digital_difference==1,并且os.path.splitext(f)[-1]是os.path.splitext(l)[-1]:
打印(f,“a是序列{0}的一部分”。格式(序列索引))
elif数字差<-1或数字差>1:
序列索引+=1
打破
其他:
打印(f,“a是序列{0}的一部分”。格式(序列索引))
lastfile=f
数字组(mylist)

注意
lastfile=files.pop(0)
。这将从
文件列表中获取第一个元素。

尝试编码阻止您的代码,以便我们可以实际读取。
is
比较对象标识,而
=
比较对象值。您希望
文件!=lastfile
列表
是一个内置类型,您正在重写它。这是一种错误的做法。@Ale
list
是一种类型,但是是的,它是内置的,不应该用作名称。我不知道这段代码试图实现什么。感谢您的详细回答!这解决了我的部分问题->不仅我列表中的第一个文件被删除,而且新序列中的每个第一个文件都会发生这种情况;例如“elementB_1001.jpg”、“bus_v01.1001.tif”“,等等。这是因为
如果len(match)==len(lastmatch).
行再次出现。对于每个序列更改,它很可能都是错误的。因此序列中的第一个文件没有打印出来,然后该文件作为
最后一个文件
放入,序列的其余部分匹配。我想您应该考虑在
if
中添加一个
else
。如果不匹配,则假定它是序列中的第一个。或者类似的东西看到编辑过的解决方案,看起来像你解释的那样工作是的,这确实像预期的那样工作!“elementB_1001.jpg”和“A02B03_0123_A444.0052.ari”未打印,因此我必须稍微调整我的循环,但您为我指出了正确的方向-谢谢!
import os, re
mylist = ["A01B02_0123_A333.01234321.ari", "A01B02_0123_A333.01234322.ari", "A01B02_0123_A333.01234323.ari", "A01B02_0123_A333.01234324.ari", "A01B02_0123_A333.01234325.ari", "A01B02_0123_A333.01234326.ari", "A01B02_0123_A333.01234327.ari", "A01B02_0123_A333.01234328.ari", "A01B02_0123_A333.01234329.ari", "A01B02_0123_A333.01234330.ari", "A01B02_0123_A333.01234331.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)