Python:重命名文件

Python:重命名文件,python,file-rename,Python,File Rename,我从XML文件中读出了它们的类别,并对它们进行了重命名和保存。 因此,文件XYZ.xml现在是News_2014.xml 问题是有几个XML文件包含2014年的新闻类别。用我的代码,我删除了所有其他文件,我只能保存一个文件。 如何保存每个文件?例如,如果有两个文件的类别为“新闻”和“2014年”,则文件名应为:News_2014_01.xml和News_2014_02.xml 由于还有其他类别,我不能简单地实现递增整数,即具有类别历史记录的另一个文件应仍然具有名称History_2014_01.

我从XML文件中读出了它们的类别,并对它们进行了重命名和保存。 因此,文件XYZ.xml现在是News_2014.xml

问题是有几个XML文件包含2014年的新闻类别。用我的代码,我删除了所有其他文件,我只能保存一个文件。 如何保存每个文件?例如,如果有两个文件的类别为“新闻”和“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') 

一旦您找到文件的“正确”名称,例如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)

一旦您找到文件的“正确”名称,例如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 solution要优雅得多,更不用说他早些发布了

您可以检查目标文件名是否已经存在,如果已经存在,请修改文件名。 对我来说,最简单的解决方案是始终从在文件名中添加“counter”开始,因此您可以从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_uu.xml”文件,您可以像往常一样创建名称,但可以调用os.renamesourcename,versioned_filenametargetname。
如果您想要更高效的解决方案,您可以解析glob.glob的输出以找到最高计数,您可以多次调用os.path.exists进行保存,但只有在您需要数百或数千个文件时才有意义。

[EDIT]@poke solution更优雅,更不用说他之前发布了

您可以检查目标文件名是否已经存在,如果已经存在,请修改文件名。 对我来说,最简单的解决方案是始终从在文件名中添加“counter”开始,因此您可以从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_uu.xml”文件,您可以像往常一样创建名称,但可以调用os.renamesourcename,versioned_filenametargetname。
如果您想要更高效的解决方案,您可以解析glob.glob的输出以找到最高计数,您可以多次调用os.path.exists进行保存,但只有在您需要数百或数千个文件时才有意义。

您可以使用字典跟踪计数。这样,重命名文件名后就不需要修改它们了。缺点是每个文件名中都有一个数字,即使该类别的最大数字最终为1


你可以用字典来记录计数。这样,重命名文件名后就不需要修改它们了。缺点是每个文件名中都有一个数字,即使该类别的最大数字最终为1


是的,这正是我要找的我补充了一个问题…:是的,这正是我要找的我补充了一个问题…:我也试过你的版本-它也有效非常感谢您的建议!!:我补充了一个问题…:我也试过你的版本-它也有效非常感谢您的建议!!:我补充了一个问题…:非常感谢你的建议!我将在另一个文件中使用此文件-非常感谢!:我补充了一个问题…:非常感谢你的建议!我将在另一个文件中使用此文件-非常感谢!:我补充了一个问题…:还有一个问题:我应该如何使用csv文件?此外,我想做的是将所有文件的内容保存在一个csv文件中,从文章编号+,+年份+文本开始。我可以简单地将所有内容保存在列表中,然后将输出写入以.csv结尾的文件中吗?谢谢你的帮助!:是的,CSV文件是一个以.CSV结尾的文件,但是,它通常也必须有某种字段分隔符,因此逗号分隔的值为-CSV。退房您可以看到如何使用它的示例。请查看模块。您可以使用writer's将一行写入CSV文件,而不必关心分隔符、转义和其他内容。还有一个问题:我应该如何使用CSV文件?此外,我想做的是将所有文件的内容保存在一个csv文件中,从文章编号+,+年份+文本开始。我可以简单地将所有内容保存在一个列表中,然后将输出写入一个文件endi吗
ngin.csv?谢谢你的帮助!:是的,CSV文件是一个以.CSV结尾的文件,但是,它通常也必须有某种字段分隔符,因此逗号分隔的值为-CSV。退房您可以看到如何使用它的示例。请查看模块。您可以使用writer将一行写入CSV文件,而无需考虑分隔符、转义等。