Python 在目录中查找图像序列-比os.walk()更快?

Python 在目录中查找图像序列-比os.walk()更快?,python,traversal,Python,Traversal,我正在尝试编写一个脚本,它将遍历一个目录(与os.walk几乎相同),但不使用os.walk。原因是每个目录都充满了图像序列,而os.walk占用了太多的时间 我的目的是收集每个图像序列的文件名。。。所以现在,一旦从一个序列中找到一个奇异的图像,我就打破了循环。如果一个目录中只有一个图像序列,那么这很好,但是如果一个目录中有两个(或更多)图像序列呢?这就是我要摆脱困境的地方 这就是我到目前为止所做的: def find_all_ImageSequences(dir): for obje

我正在尝试编写一个脚本,它将遍历一个目录(与os.walk几乎相同),但不使用os.walk。原因是每个目录都充满了图像序列,而os.walk占用了太多的时间

我的目的是收集每个图像序列的文件名。。。所以现在,一旦从一个序列中找到一个奇异的图像,我就打破了循环。如果一个目录中只有一个图像序列,那么这很好,但是如果一个目录中有两个(或更多)图像序列呢?这就是我要摆脱困境的地方

这就是我到目前为止所做的:

def find_all_ImageSequences(dir):

    for object in os.listdir(dir):
        if os.path.isdir(dir + "\\" + str(object)):
            find_all_ImageSequences(dir + "\\" + str(object))
        else:
            if object.endswith(('.dpx','.jpg','.jpeg','.exr','.tif')):
                Image_Sequences_List.append(dir + "\\" + str(object))
                image_filename = object.split(".")[0]
                extras = [x for x in os.listdir(dir) if x.split(".")[0] != image_filename]
                if extras:
                    "try to take the 1st image and add it to my Image_Sequences_List"
                break
“extras”列表将继续查看该目录中的每个对象,即使在找到第二个图像序列之后也是如此。一旦找到下一个图像序列中的第一帧,是否有可能打破这种状态

我考虑使用:

if any([x for x in os.listdir(dir) if x.split(".")[0] != image_filename]):
    "do something"
但这似乎适得其反,因为我必须再次遍历当前目录才能找到下一个序列

这样做的最佳方式是什么


非常感谢

此代码使用集合来跟踪已添加的文件名:

def find_all_ImageSequences(dir):
    seen = set()
    for object in os.listdir(dir):
        if os.path.isdir(dir + "\\" + str(object)):
            find_all_ImageSequences(dir + "\\" + str(object))
        else:
            if object.endswith(('.dpx','.jpg','.jpeg','.exr','.tif')):
                image_filename = object.split(".", 1)[0]
                if image_filename not in seen:
                    Image_Sequences_List.append(dir + "\\" + str(object))
                    seen.add(image_filename)


为了提高性能,请检查一下有一个
os.walk
替代品,据称它在Windows上的速度约为8-9倍,在Linux和Mac os X上的速度约为2-3倍。

经过一些调整后,我发现这是最快的解决方案

def find_all_ImageSequences(dir):

    child_directories = [x for x in os.listdir(dir) if len(x.split(".")) == 1]
    if len(child_directories) >= 1:
        for directory in child_directories:
            if os.path.isdir(dir + "\\" + directory):
                find_all_ImageSequences(dir + "\\" + directory)

    for object in os.listdir(dir):
        if object.endswith(('.dpx','.jpg','.jpeg','.exr','.tif')):
            image_filename = object.split(".")[0]
            Image_Sequences_List.append(dir + "\\" + str(object))
            if any([x for x in os.listdir(dir) if x.split(".")[0] != image_filename and len(x.split(".")) > 1]):
                extras = set([x.split(".")[0] for x in os.listdir(dir) if x.split(".")[0] != image_filename])
                for i in extras:
                    Image_Sequences_List.append(i)
            break
我做了一个快速测试,将此函数与标准os.walk()进行了比较:

  • os.walk()平均耗时53秒
  • 查找所有图像序列()平均耗时5秒

如果找不到其他图像序列,则从这开始的速度主要是从目录中断。感谢詹妮·卡里拉的帮助。事实证明,使用set()非常有用

图像序列是什么意思?一套文件?如何判断哪些文件属于同一序列?本例中的图像序列是来自电影剪辑的图像(帧)列表。例如,图像序列中的每个图像共享相同的名称;movie.001.jpg,movie.002.jpg,movie.003.jpg。另一个图像序列看起来像;holiday.001.jpg,holiday.002.jpg etcI是这样的,但是它仍然没有检查序列中的每个图像吗?我想,如果可能的话,快速找到1个图像,然后跳出该目录,除非有另一个图像序列要查找。因此,也许我可以将示例中的any()语句与此结合使用。你觉得怎么样?@iGwok如果你事先不知道一个目录中有多少序列,你必须检查所有的文件名。也许最后一个是单帧序列。我知道,我希望有一个比迭代每个图像文件更快的解决方案。例如,使用列表理解似乎比使用For循环要快,而我使用的any()语句在分析目录中的内容时似乎要快得多。还有什么可以加快速度的吗。速度是这里的关键。thanks@iGwok大部分时间用于从操作系统检索目录信息。请参阅我的上一次编辑,了解该领域可能的改进。