[英]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.