繁体   English   中英

Python:重命名文件

[英]Python : Rename files

我从XML文件中读取了它们的类别,然后重命名并保存了年份。 因此,文件“ XYZ.xml”现在为“ News_2014.xml”。

问题是从2014年开始,有几个XML文件的类别为“新闻”。使用我的代码,我删除了所有其他文件,并且只能保存1个文件。 为了保存每个文件,我该怎么办? 例如,如果有2个类别为“新闻”和2014年的文件,则文件名应为:“ News_2014_01.xml”和“ News_2014_02.xml”。

由于还有其他类别,因此我不能简单地实现一个递增的整数,即,另一个类别为“ History”的文件仍应具有名称“ 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') 

一旦找出了文件的“正确”名称,例如News_2014.xml ,就可以进行循环检查文件是否存在,并在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)

[编辑] @poke解决方案更加优雅,更不用说他早些时候发布了

您可以检查目标文件名是否已经存在,如果存在,请修改文件名。 对我来说,最简单的解决方案是始终从在文件名中添加“计数器”开始,因此您从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的多次调用,但这仅在您期望成百上千个文件时才有意义。

您可以使用字典来跟踪计数。 这样,重命名文件后就无需修改文件名。 不利的一面是,即使该文件名的最大数量最终为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]))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM