Python でバッチ名前変更スクリプトを作成しますか?

Python でバッチ名前変更スクリプトを作成しますか?

まず、この質問は前回の質問のフォローアップとして作成されました。「変数」を使用してファイルの名前を一括変更するにはどうすればいいですか?私はセルゲイの勧告を考慮してそれを言い直しているだけです。

私はテレビ番組を見るのに xmbc を使っています。xmbc を使い始める前に、「Bleach」の最初の数シーズンを一括ダウンロードしました。何と言っていいかわかりませんが、私はアニメ ファンです ;-)。これらのファイルは「bleachxx.mp4」という名前で、xx はシーズンではなくシリーズ全体のエピソード番号です。つまり、「bleach21.mp4」は第 2 シーズンの第 1 エピソードで全体では 21 番目のエピソードです。ただし、ファイル自体は独自のシーズン フォルダーに分割されています。

問題は、コマンドによってすべてのファイルの名前が「Bleach S0XExx」に変更されるが、ファイルには全体のファイル番号があるため、シーズン 3 に 52 のエピソードがないことが明らかであるにもかかわらず、bleach52.mp4 --> 'Bleach S03E52.mp4' となることです。

この問題を解決するには、全体の数から前のシーズンのエピソード数を減算し、特定のシーズン番号を取得する必要があります。

例: シーズン 1 に 20 のエピソードがある場合、25-20=5 となり、25 番目のエピソードはシーズン 2 の 5 番目のエピソードとなり、名前の変更は通常どおり実行されます。

私はコーディングの初心者ですが、この問題を解決するには Python スクリプトが効果的だと言われたので、これを提案しました。このスクリプトを段階的に記述するプロセスを誰か手伝ってくれませんか? よろしくお願いします!

答え1

思いつきですが、試してみてください:

# call program as: epirename.py /path/to/mp4files 20 41 59
# the numbers are the sequence of first episodes in each season after the first
import os
import re
import sys
mp4dir = sys.argv[1]
seasons = [int(startnum) for startnum in sys.argv[2:]]
seasons.insert(0, 0) # start with '0' as the first episode of season 1
season = 0
patt = re.compile(r'([[:alpha:]]+)([[:digit:]]+).mp4')
for filename in sorted(os.listdir(mp4dir)):
    match = patt.search(filename)
    if match:
        episode = int(match.group(2))
        try:
            if episode >= seasons[season+1]:
                season += 1
        except:
            pass
        # create new filename as '{basename}S{season}E{episode}'
        newname = '%sS%02dE%03d.mp4' % (match.group(1), season+1, episode - seasons[season])
        os.rename(os.path.join(dir, filename),
                  os.path.join(dir, newname))
        print 'renamed', filename 'to', newname

その結果、「{name}{epi}.mp4」に一致するファイルは「{name}S{season}E{episode}.mp4」に名前が変更されます。他のファイルはそのまま残ります。

繰り返しますが、これは私の思いつきであり、より効率的なテクニックがあるかもしれません。

関連情報