python - File Renaming efter konvention - Alt i en mappe

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg finder mig ofte i en situation, hvor jeg har en mappe, der indeholder filer, der er navngivet efter en bestemt filnavnetekonvention, og jeg skal gennemgå dem manuelt for at omdøbe dem til den, jeg vil have. En besværlig gentagne opgave.


F.eks. 01\_artist\_name\_-\_album\_title\_-\_song\_title\_somethingelse.mp3 -> Song\_Title.mp3


Så fjernelse af visse bits af information, udskiftning af understregninger med mellemrum og kapitalisering. Ikke kun for musik, det er bare et eksempel.


Jeg har tænkt på at automatisere denne opgave ved hjælp af Python. I grund og grund vil jeg kunne indlede startkonventionen og min ønskede konvention og for at omdøbe dem alle i overensstemmelse hermed.


Ideelt set vil jeg kunne gøre dette i Python på Windows, men jeg har en Ubuntu-maskine, jeg kunne bruge til dette, hvis det var lettere at gøre i bash (eller Python på UNIX).


Hvis nogen kan kaste lys over, hvordan jeg kan henvende mig til dette problem (forslag til IO python kommandoer, der læser indholdet af en mappe - og omdøbe filer - på Windows, og hvordan jeg kan gå om at fjerne informationen fra filnavnet og kategorisere det, måske ved at bruge RegEx?) Jeg vil se, hvad jeg kan få det til at gøre og opdatere med fremskridt.

Bedste reference


Til din særlige sag:


import  glob, shutil, os.path

# glob.glob returns a list with all pathes according to the given pattern 
for path in glob.glob("music\_folder/*.mp3"):

     # os.path.dirname gives the directory name, here it is "music\_folder"
     dirname = os.path.dirname(path)

     # example: 01\_artist\_name\_-\_album\_title\_-\_song\_title\_somethingelse.mp3
     # split returns "\_song\_title\_somethingelse.mp3"
     interesting = path.split("-")[2]

     # titlepart is a list with ["song", "title"], the beginning "\_" and the
     # 'somehting' string is removed by choosing the slice 1:-1
     titlepart = interesting.split("\_")[1:-1]

     # capitalize converts song -> Song, title -> title
     # join gluest both to "Song\_Title"
     new\_name = "\_".join(p.capitalize() for p in titlepart)+".mp3"

     # shutil.move renames the given file
     shutil.move(path, os.path.join(dirname, new\_name))


Hvis du vil bruge regulært udtryk, skal du erstatte:


     m=re.search(".*-\_(S+\_S+)\_.*",path)
     if m is None:
        raise Exception("file name does not match regular expression")
     song\_name = m.groups()[0]
     titlepart = song\_name.split("\_")