我有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
...
每次我下载一个主题的新图像并将其保存在文件夹A中时,我必须为该图像计算一个新的路径名(我必须找到特定主题的最小增量编号)。问题是,当我处理图像时,我将其从文件夹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 :(得分:0)
我找到了另一种解决方案:将文件的哈希值用作唯一文件名