python显示图像序列,如何以有效的方式列出图像序列? Python中的数字序列比较...

博客探讨了如何使用Python对文件名进行排序并识别连续序列,特别是在处理图像文件目录时。通过示例代码展示了如何从文件名中提取数字、识别连续序列并创建简洁的表示方式,如image_000[1-3],以提高可读性。
摘要由CSDN通过智能技术生成

I have a directory of 9 images:

image_0001, image_0002, image_0003

image_0010, image_0011

image_0011-1, image_0011-2, image_0011-3

image_9999

I would like to be able to list them in an efficient way, like this (4 entries for 9 images):

(image_000[1-3], image_00[10-11], image_0011-[1-3], image_9999)

Is there a way in python, to return a directory of images, in a short/clear way (without listing every file)?

So, possibly something like this:

list all images, sort numerically, create a list (counting each image in sequence from start).

When an image is missing (create a new list), continue until original file list is finished.

Now I should just have some lists that contain non broken sequences.

I'm trying to make it easy to read/describe a list of numbers. If I had a sequence of 1000 consecutive files It could be clearly listed as file[0001-1000] rather than file['0001','0002','0003' etc...]

Edit1(based on suggestion): Given a flattened list, how would you derive the glob patterns?

Edit2 I'm trying to break the problem down into smaller pieces. Here is an example of part of the solution:

data1 works, data2 returns 0010 as 64, data3 (the realworld data) doesn't work:

# Find runs of consecutive numbers using groupby. The key to the solution

# is differencing with a range so that consecutive numbers all appear in

# same group.

from operator import itemgetter

from itertools import *

data1=[01,02,03,10,11,100,9999]

data2=[0001,0002,0003,0010,0011,0100,9999]

data3=['image_0001','image_0002','image_0003','image_0010','image_0011','image_0011-2','image_0011-3','image_0100','image_9999']

list1 = []

for k, g in groupby(enumerate(data1), lambda (i,x):i-x):

list1.append(map(itemgetter(1), g))

print 'data1'

print list1

list2 = []

for k, g in groupby(enumerate(data2), lambda (i,x):i-x):

list2.append(map(itemgetter(1), g))

print '\ndata2'

print list2

returns:

data1

[[1, 2, 3], [10, 11], [100], [9999]]

data2

[[1, 2, 3], [8, 9], [64], [9999]]

解决方案

Here is a working implementation of what you want to achieve, using the code you added as a starting point:

#!/usr/bin/env python

import itertools

import re

# This algorithm only works if DATA is sorted.

DATA = ["image_0001", "image_0002", "image_0003",

"image_0010", "image_0011",

"image_0011-1", "image_0011-2", "image_0011-3",

"image_0100", "image_9999"]

def extract_number(name):

# Match the last number in the name and return it as a string,

# including leading zeroes (that's important for formatting below).

return re.findall(r"\d+$", name)[0]

def collapse_group(group):

if len(group) == 1:

return group[0][1] # Unique names collapse to themselves.

first = extract_number(group[0][1]) # Fetch range

last = extract_number(group[-1][1]) # of this group.

# Cheap way to compute the string length of the upper bound,

# discarding leading zeroes.

length = len(str(int(last)))

# Now we have the length of the variable part of the names,

# the rest is only formatting.

return "%s[%s-%s]" % (group[0][1][:-length],

first[-length:], last[-length:])

groups = [collapse_group(tuple(group)) \

for key, group in itertools.groupby(enumerate(DATA),

lambda(index, name): index - int(extract_number(name)))]

print groups

This prints ['image_000[1-3]', 'image_00[10-11]', 'image_0011-[1-3]', 'image_0100', 'image_9999'], which is what you want.

HISTORY: I initially answered the question backwards, as @Mark Ransom pointed out below. For the sake of history, my original answer was:

You're looking for glob. Try:

import glob

images = glob.glob("image_[0-9]*")

Or, using your example:

images = [glob.glob(pattern) for pattern in ("image_000[1-3]*",

"image_00[10-11]*", "image_0011-[1-3]*", "image_9999*")]

images = [image for seq in images for image in seq] # flatten the list

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值