Python:重命名文件

时间:2014-03-09 14:04:43

标签: python file-rename

我从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') 

3 个答案:

答案 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]))