2011-10-23 23 views
1

私は検索と置換によってファイル名の束をリネームする小さなpythonスクリプトを書こうとしています。たとえば、次のようにバッチ検索とファイル名の文字列をPythonに置き換えます

オリジナルファイル名: MyMusic.Songname.Artist-mp3.iTunes.mp3

Intendet結果: Songname.Artist.mp3

私がこれまで持っていることである。

#!/usr/bin/env python 
from os import rename, listdir 

mustgo = "MyMusic." 
filenames = listdir('.') 

for fname in fnames: 
    if fname.startswith(mustgo): 
    rename(fname, fname.replace(mustgo, '', 1)) 

は、これが唯一の文字列を取り除くだろう、

とにかく(私の知る限り覚えて、このサイトからそれを得ました)ファイル名には含まれていません。

また、コード全体を編集しなくても更新できるように、検索と置換が必要なすべての文字列を含む別のファイル(badwords.txtなど)を使用したいと考えています。

Content of badwords.txt 
MyMusic. 
-mp3 
-MP3 
.iTunes 
.itunes 

私はかなりの時間を探していますが、何も見つかりませんでした。助けていただければ幸いです!

ありがとうございました!

+0

:あなた はpatの先頭に'(?i)'を追加することにより、ケースを無視することができコマンド。 –

答えて

3
import fnmatch 
import re  
import os 

with open('badwords.txt','r') as f: 
    pat='|'.join(fnmatch.translate(badword)[:-1] for badword in 
       f.read().splitlines()) 

for fname in os.listdir('.'): 
    new_fname=re.sub(pat,'',fname) 
    if fname != new_fname: 
     print('{o} --> {n}'.format(o=fname,n=new_fname)) 
     os.rename(fname, new_fname) 

# MyMusic.Songname.Artist-mp3.iTunes.mp3 --> Songname.Artist.mp3 
  • badwordsが削除された後、2名が同じ短縮名に減少し得れば、いくつかのファイルが上書きされることは可能であることに注意してください(したがって が失われました)。 名前の衝突によってデータが失われないように、新しいファイル名のセットを保持して をチェックしてからos.renameを呼び出すことができました。
  • fnmatch.translateはシェルスタイルのパターンをとり、 相当の正規表現を返します。上記のバッドワード (たとえば'.iTunes')を正規表現(たとえばr'\.iTunes')に変換するために使用されています。
  • あなたのバッドワードリストは、大文字と小文字を無視したいことを示しているようです。 Perlは特にによる素晴らしい正規表現をサポートし、実行しているシステムの容易さに、良い作品ファイル名を変更するには、いくつかの汚い小さな-と、スクリプトの場合

    with open('badwords.txt','r') as f: 
        pat='(?i)'+'|'.join(fnmatch.translate(badword)[:-1] for badword in 
             f.read().splitlines()) 
    
+0

クイック返信ありがとう!上書きされたファイルに問題はないはずです。そして、私の悪意のあるファイルは、私が大文字小文字を無視したいということを示しているようですが、そうではありません。しかし、私は次のような問題があります:ファイル '/usr/lib/python2.7/re.py"、行244、_compile エラーを起こす、v#無効な式 sre_constants.error:不明な拡張子 ' – k3njiy

+0

そしてそれをpython 3私は取得:ファイル "/usr/lib/python3.2/sre_parse.py"、行653、_parseで エラーを発生させる( "不明な拡張子") sre_constants.error:不明な拡張子 – k3njiy

+0

あなたは ' badwords.txt'?もしそうなら、正規表現をそこに直接書いて、 'fnmatch.translate'を使わないでください。コードはよりシンプルになり、regexを直接使用することでより多彩なパターンマッチングが可能になります。 – unutbu

関連する問題