2011-03-13 63 views
0

我有2个文件夹。第一个(称为A)包含以下形式命名的相同图像:subject_incrementalNumber.jpg(其中incrementalNumber从0到X)。加快创建路径名称

然后,我处理包含在文件夹A中的每个图像,并从中提取一些小块,然后将每个小块保存在文件夹B中,其名称为subject(与文件夹A中包含的原始图像相同)_incrementalNumber(与文件夹相同A)_anotherIncrementalNumber(区分一件和另一件)。

最后,我删除文件夹A.

A 
    subjectA_0.jpg 
    subjectA_1.jpg 
    subjectA_2.jpg 
    ... 
    subjectB_0.jpg 

B 
    subjectA_0_0.jpg 
    subjectA_0_1.jpg 

    subjectA_1_0.jpg 

    subjectA_2_0.jpg 
    ... 

每次我下载一个主题的新形象处理后的图像,并将其保存在文件夹中,我不得不计算出新的路径名该图像(I必须找到可用于特定主题的min incrementalNumber)。问题是,当我处理图像时,我将它从文件夹A中删除,而我只将这些文件存储在文件夹B中,因此我必须在两个文件夹中找到可用的最小编号。

现在我用下面的函数来创建路径

output_name = chooseName(subject, folderA, folderB) 

# Create incremental file 
# If the name already exist, try with incremental number (0, 1, etc.) 
def chooseName(owner, dest_files, faces_files): 
    # found the min number available in both folders 
    v1 = seekVersion_downloaded(owner, dest_files) 
    v2 = seekVersion_faces(owner, faces_files) 

    # select the max from those 2 
    version = max(v1, v2) 

    # create name 
    base = dest_files + os.sep + owner + "_" 
    fname = base + str(version) + ".jpg" 
    return fname 


# Seek the min number available in folderA 
def seekVersion_folderA(owner, dest_files): 
    def f(x): 
     if fnmatch.fnmatch(x, owner + '_*.jpg'): return x 

    res = filter(f, dest_files) 

    def g(x): return int(x[x.find("_")+1:-len(".jpg")]) 
    numbers = map(g, res) 

    if len(numbers) == 0: return 0 
    else: return int(max(numbers))+1 


# Seek the min number available in folderB 
def seekVersion_folderB(owner, faces_files): 
    def f(x): 
     if fnmatch.fnmatch(x, owner + '_*_*.jpg'): return x 

    res = filter(f, faces_files) 

    def g(x): return int(x[x.find("_")+1:x.rfind("_")]) 
    numbers = map(g, res) 

    if len(numbers) == 0: return 0 
    else: return int(max(numbers))+1 

它的工作原理,但这个过程需要大约10秒为每个图像,因为我有很多的图片,这是效率太低。 有任何解决方法使其更快?

回答

0

我找到了另一种解决办法:使用该文件的哈希值作为唯一的文件名

1

如上所述,这确实是一个没有魔法捷径的难题。为了找到可用的最小数量,您需要使用试验和错误,就像您正在做的一样。虽然实施可以加快,但算法存在根本的局限性。

我想我会放松这个问题的一些限制。我会准备选择不是最小可用的数字。我会在包含创建文件时使用的最后一个数字的目录中存储隐藏文件。每当您创建另一个文件时,请从该文件中读取该数字,将其增加1,然后查看该名称是否可用。如果是这样,你很好走,如果没有,从那里开始数。请记住在确定名称时更新文件。

如果没有人正在读这些名字,那么使用随机生成的名字可能会更好。

+1

,如果你使用的是随机生成一个确保它不会与现有的第一碰撞。 – 2011-03-13 21:56:49

+0

@archimedes确实! – 2011-03-13 21:59:13

+0

@David:你的想法很好,但问题是主题的名称必须是路径名(这不是我的选择)。所以我可以创建一个隐藏文件,其中每行包含主题名称和最小可用编号。同样在这种情况下,我有一个开销,但这可能是当前的小事。 – 2011-03-13 22:31:49