假设我正在编写名为foo.001
的文件,但001
被基于真正存在的文件的最低免费索引所取代。写这个最优雅的方式是什么?这是我使用的东西,但它看起来不太好,是吗?
base='foo'
i=0
while True:
i+=1; name=base+'.%03d'%i
if not os.path.exists(name): break
# use name here
最好的建议是最受欢迎的。
编辑:查找不会并行运行,而且我需要最低的未使用索引(并行查找并不总是给出最低的索引)。还假设我不能列出已经使用的所有名称,只测试是否存在(我不仅要将其用于文件,而且通常使用命名对象,并且列表并不总是可行或有效)。
答案 0 :(得分:3)
相同数量的陈述,但可能稍微更具可读性。使用itertools.count
:
from itertools import count
def next_available(base):
for ext in count(start=1):
name = '{}.{:03d}'.format(base, ext)
if not os.path.exists(name):
return name
答案 1 :(得分:1)
import glob
used_filenames = {name:True for name in glob.glob('foo.[0-9][0-9][0-9]'))}
for i in range(1000):
prospect = "foo.{:03d}".format(i)
if prospect not in used_filenames:
print("The next unused filename is", prospect)
break
答案 2 :(得分:0)
这是一个建议:
import os
path = '/home/mydir'
existingnumbers = [int(entry.split('.')[1]) for entry in os.listdir(path) if 'foo.' in entry]
potentialnumbers = range(len(existingnumbers)+1)
newfile = 'foo.{0}'.format(min(set(potentialnumbers) - set(existingnumbers)))