簡體   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