我从XML文件中读出了他们的类别,我重命名并用年保存它们。 因此,文件“XYZ.xml”现在是“News_2014.xml”。
问题是2014年有几个带有“新闻”类别的XML文件。通过我的代码,我删除了所有其他文件,我只能保存1个文件。 为了保存每个文件,我该怎么办?例如,如果有2个文件的类别为“新闻”和2014年,则文件名应为:“News_2014_01.xml”和“News_2014_02.xml”。
由于还有其他类别,我不能简单地实现增加的整数,即具有“历史”类别的另一个文件仍应具有名称“History_2014_01.xml”(而不是... 03.xml)。
实际上,我有以下代码:
for text, key in enumerate(d):
#print key, d[key]
name = d[key][(d[key].find("__")+2):(d[key].rfind("__"))]
year = d[key][(d[key].find("*")+1):(d[key].rfind("*"))]
cat = d[key][(d[key].rfind("*")+1):]
os.rename(name, cat+"_"+year+'.xml')
答案 0 :(得分:2)
一旦找到了文件的“正确”名称,例如News_2014.xml
,您可以创建一个循环来检查文件是否存在并为其添加递增后缀,而在这种情况下:
import os
fileName = 'News_2014.xml'
baseName, extension = os.path.splitext(fileName)
suffix = 0
while os.path.exists(os.path.join(directory, fileName)):
suffix += 1
fileName = '{}_{:02}.{}'.format(baseName, suffix, extension)
print(fileName)
os.rename(originalName, fileName)
你可以把它放到一个函数中,这样更容易使用:
def getIncrementedFileName (fileName):
baseName, extension = os.path.splitext(fileName)
suffix = 0
while os.path.exists(os.path.join(directory, fileName)):
suffix += 1
fileName = '{}_{:02}.{}'.format(baseName, suffix, extension)
return fileName
然后在您的代码中使用它:
for key, item in d.items():
name = item[item.find("__")+2:item.rfind("__")]
year = item[item.find("*")+1:item.rfind("*")]
cat = item[item.rfind("*")+1:]
fileName = getIncrementedFileName(cat + '_' + year + '.xml')
os.rename(name, fileName)
答案 1 :(得分:1)
[编辑] @poke解决方案更优雅,更不用说他早些发布了
您可以检查目标文件名是否已存在,如果存在,请修改filename。 对我来说最简单的解决方案是始终将“计数器”添加到文件名,所以你从News_2014_000.xml开始(可能最好准备100多个文件?)。
稍后循环直到找到不存在的文件名:
def versioned_filename(candidate):
target = candidate
while os.path.exists(target):
fname, ext = target.rsplit('.', 1)
head, tail = fname.rsplit('_', 1)
count = int(tail)
#:03d formats as 3-digit with leading zero
target = "{}_{:03d}.{}".format(head, count+1, ext)
return target
因此,如果您想保存为'News_2014 _ ###。xml'文件,您可以照常创建名称,但请致电os.rename(sourcename, versioned_filename(targetname))
。
如果你想要更高效的解决方案,你可以解析glob.glob()
的输出以找到最高计数,你将节省多次调用os.path.exists,但只有当你期望数百或数千个文件时它才有意义。 / p>
答案 2 :(得分:1)
您可以使用字典来跟踪计数。这样,重命名后无需修改文件名。缺点是每个文件名中都有一个数字,即使该类别的最大数字最终为1
。
cat_count = {}
for text, key in enumerate(d):
name = d[key][(d[key].find("__")+2):(d[key].rfind("__"))]
year = d[key][(d[key].find("*")+1):(d[key].rfind("*"))]
cat = d[key][(d[key].rfind("*")+1):]
cat_count[cat] = cat_count[cat] + 1 if cat in cat_count else 1
os.rename(name, "%s_%s_%02d.xml" % (cat, year, cat_count[cat]))