2011-10-23 21 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

對於一些小的和骯髒的腳本來更改文件名的Perl工作得更好,特別是由於巨大的正則表達式的支持和運行系統的簡易性:你 可以通過添加'(?i)'pat開始忽略大小寫命令。 –

回答

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已被刪除後還原到同一縮短名字。在調用os.rename之前,可以保留一組新的fname,並檢查 ,以防止通過 名稱衝突丟失數據。
  • fnmatch.translate採用殼式樣式並返回 等效正則表達式。它用於將壞詞 (例如'.iTunes')轉換爲正則表達式(例如r'\.iTunes')。
  • 你的壞話列表似乎表明你想忽略大小寫。

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

感謝您的快速回復!文件被覆蓋不應該有任何問題。而且,我所有的badwords文件似乎都表明我想忽略大小寫,事實並非如此。但我有以下問題:'文件「/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