這才是當初學編程想實現的事情

2018-12-08

最近,下了載了一部動畫 Psycho-Pass 。每集視頻的命名是這樣的:


.
├── 【AGE动漫】[Kamigami][01][1280x720 x264 AAC Sub(CH,JP)].mp4
├── 【AGE动漫】[Kamigami][02][1280x720 x264 AAC Sub(CH,JP)].mp4
├── ...
└── 【AGE动漫】[Kamigami][22][1280x720 x264 AAC Sub(CH,JP)].mp4

看著命名格式很不舒服,加上每集都沒有對應的標題,不能忍。於是,打算將它們重新命名。如果手動逐一修改,那將會是極其枯燥無聊的重複性的工作,重複性的工作當然將它們步驟代碼化,然後交給電腦完成剩下重複性操作。

寫代碼之間,首先想清楚最後想要實現的結果。

我預期是每集視頻都以序號+名稱.擴展名來呈現。分析現在的命名格式,我能拿到的是每集序號,如 01 ,還有擴展名 .mp4。那麼與預期效果只剩下每集的名稱了。我在維基百科上找到了 Psycho-Pass 的條目,並且裡頭有以表格列出的每集信息。我將表格內容拷貝到 Google sheet。因為我只需要每集的名稱,保留每集名稱列,其餘都刪除,以 csv 格式保存,因為動畫有兩季,所以我將其分別保存為 season1.csvseason2.csv。其中第二季中第一集《正義的天秤〈299/300〉>》和第八集《巫女的懷孕》以及第十一集《什麼顏色?》,即使我是使用 Linux 系統,但是反斜杠 / 命名依然不合法的,另外,還考慮到未來可能會上傳到網盤,那麼統一將 <>? 都去掉。現在我的工作區的文件結構如下:


├── season1
   ├── 【AGE动漫】[Kamigami][01][1280x720 x264 AAC Sub(CH,JP)].mp4
   ├── 【AGE动漫】[Kamigami][02][1280x720 x264 AAC Sub(CH,JP)].mp4
   ├── 【AGE动漫】[Kamigami][03][1280x720 x264 AAC Sub(CH,JP)].mp4
   ├── 【AGE动漫】[Kamigami][04][1280x720 x264 AAC Sub(CH,JP)].mp4
   ├── 【AGE动漫】[Kamigami][05][1280x720 x264 AAC Sub(CH,JP)].mp4
   ├── 【AGE动漫】[Kamigami][06][1280x720 x264 AAC Sub(CH,JP)].mp4
   ├── ...
   └── 【AGE动漫】[Kamigami][22][1280x720 x264 AAC Sub(CH,JP)].mp4
├── season2
   ├── 【AGE动漫】[Kamigami][01][BD 720p x264 AAC Sub(Chs,Jap)].mp4
   ├── 【AGE动漫】[Kamigami][02][BD 720p x264 AAC Sub(Chs,Jap)].mp4
   ├── ...
   └── 【AGE动漫】[Kamigami][11][BD 720p x264 AAC Sub(Chs,Jap)].mp4
├── rename.py
├── season1.csv
└── season2.csv

剛才保存的 season2.csvseason1.csv 裡面的結構是一致的,season2.csv 展示如下:


正义的天秤
悄悄逼近的虚实
恶魔的证明
约伯的救济
不被禁止的游戏
丢石头的人们
找不到的孩子们
巫女的怀孕
全能者的悖论
灵魂的基准
什么颜色

運行代碼:


import os


def season1():

    os.chdir('../smb/season1')
    number = []

    with open('../season1.csv', 'r') as f:
        episode = f.read().splitlines()

    for n in range(1, len(episode)+1):

        n = str(n).zfill(2)
        number.append(n)

    episode = dict(zip(number, episode))

    for file in os.listdir():
        file_name, file_ext = os.path.splitext(file)
        file_order = file_name[18:20]
        new_name_season1 = '{} {}{}'.format(file_order, episode.get(file_order), file_ext)

        os.rename(file, new_name_season1)


def season2():
    os.chdir('../season2')
    number = []

    with open('../season2.csv', 'r') as f:
        episode = f.read().splitlines()

    for n in range(1, len(episode)+1):
        n = str(n).zfill(2)
        number.append(n)

    episode = dict(zip(number, episode))

    for file in os.listdir():
        file_name, file_ext = os.path.splitext(file)
        file_order = file_name[18:20]

        new_name_season2 = '{} {}{}'.format(file_order, episode.get(file_order), file_ext)

        os.rename(file, new_name_season2)


def run():
    season1()
    season2()


if __name__ == '__main__':
    run()

重命名後結果:


.
├── rename.py
├── season1
   ├── 01 犯罪系数.mp4
   ├── 02 人尽其才.mp4
   ├── 03 饲育的规则.mp4
   ├── 04 你无人知晓的面具.mp4
   ├── 05 你无人知晓的面孔.mp4
   ├── 06 狂王子的归来.mp4
   ├── 07 紫兰的花语.mp4
   ├── 08 剩下的、只有沉默.mp4
   ├── 09 乐园的果实.mp4
   ├── 10 玛土撒拉的游戏.mp4
   ├── 11 圣人的晚餐.mp4
   ├── 12 魔鬼的十字路口.mp4
   ├── 13 来自深渊的邀请.mp4
   ├── 14 甜美的毒药.mp4
   ├── 15 硫磺飘落的街道.mp4
   ├── 16 审判之门.mp4
   ├── 17 铁石心肠.mp4
   ├── 18 写在水上的约定.mp4
   ├── 19 透明的影子.mp4
   ├── 20 正义的所在.mp4
   ├── 21 血的奖赏.mp4
   └── 22 完美的世界.mp4
├── season1.csv
├── season2
   ├── 01 正义的天秤.mp4
   ├── 02 悄悄逼近的虚实.mp4
   ├── 03 恶魔的证明.mp4
   ├── 04 约伯的救济.mp4
   ├── 05 不被禁止的游戏.mp4
   ├── 06 丢石头的人们.mp4
   ├── 07 找不到的孩子们.mp4
   ├── 08 巫女的怀孕.mp4
   ├── 09 全能者的悖论.mp4
   ├── 10 灵魂的基准.mp4
   └── 11 什么颜色.mp4
└── season2.csv