Python:重命名文件
我从XML文件中读出了它们的类别,并对它们进行了重命名和保存。 因此,文件XYZ.xml现在是News_2014.xml 问题是有几个XML文件包含2014年的新闻类别。用我的代码,我删除了所有其他文件,我只能保存一个文件。 如何保存每个文件?例如,如果有两个文件的类别为“新闻”和“2014年”,则文件名应为:News_2014_01.xml和News_2014_02.xml 由于还有其他类别,我不能简单地实现递增整数,即具有类别历史记录的另一个文件应仍然具有名称History_2014_01.xml而不是…03.xml 实际上,我有以下代码: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.
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文件,而无需考虑分隔符、转义等。