使用python批量搜索和替换文件名中的字符串

时间:2011-10-23 00:05:10

标签: python linux filenames rename

我正在尝试编写一个小的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

我一直在寻找相当长的一段时间,但还没找到任何东西。非常感谢任何帮助!

谢谢!

1 个答案:

答案 0 :(得分: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已被删除。可以保留一组新的fnames 在调用os.rename之前检查以防止丢失数据 名称冲突。
  • fnmatch.translate采用shell样式模式并返回 等效正则表达式。上面用它来转换坏词 (例如'.iTunes')到正则表达式(例如r'\.iTunes')。
  • 你的坏词列表似乎表明你想忽略大小写。您 可以通过将'(?i)'添加到pat的开头来忽略大小写:

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