Python 在目录中查找图像序列-比os.walk()更快?
我正在尝试编写一个脚本,它将遍历一个目录(与os.walk几乎相同),但不使用os.walk。原因是每个目录都充满了图像序列,而os.walk占用了太多的时间 我的目的是收集每个图像序列的文件名。。。所以现在,一旦从一个序列中找到一个奇异的图像,我就打破了循环。如果一个目录中只有一个图像序列,那么这很好,但是如果一个目录中有两个(或更多)图像序列呢?这就是我要摆脱困境的地方 这就是我到目前为止所做的:Python 在目录中查找图像序列-比os.walk()更快?,python,traversal,Python,Traversal,我正在尝试编写一个脚本,它将遍历一个目录(与os.walk几乎相同),但不使用os.walk。原因是每个目录都充满了图像序列,而os.walk占用了太多的时间 我的目的是收集每个图像序列的文件名。。。所以现在,一旦从一个序列中找到一个奇异的图像,我就打破了循环。如果一个目录中只有一个图像序列,那么这很好,但是如果一个目录中有两个(或更多)图像序列呢?这就是我要摆脱困境的地方 这就是我到目前为止所做的: def find_all_ImageSequences(dir): for obje
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大部分时间用于从操作系统检索目录信息。请参阅我的上一次编辑,了解该领域可能的改进。