我正在尝试编写一个脚本来遍历目录(与 os.walk 几乎相同),但不使用 os.walk。原因是每个目录都充满了图像序列,而 os.walk 花费了太多时间。
我的目的是收集每个图像序列的文件名...所以目前,一旦找到序列中的一个单一图像,我就会跳出循环。如果目录中只有 1 个图像序列,则此方法可以正常工作,但如果目录中有 2 个(或更多)图像序列怎么办?这就是我要摆脱困境的地方。
这是我到目前为止所拥有的:
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)
<小时/>
要提高性能,请查看 https://github.com/benhoyt/scandir它有一个 os.walk
替代品,据称在 Windows 上速度大约是 8-9 倍,在 Linux 和 Mac OS X 上大约是 2-3 倍。
关于python - 在目录中查找图像序列 - 比 os.walk() 更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21755625/