繁体   English   中英

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

[英]batch search and replace strings in filenames with python

我正在尝试编写一个小的python脚本,通过搜索和替换来重命名一堆文件名。 例如:

原始文件名:MyMusic.Songname.Artist-mp3.iTunes.mp3

结果: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))

(据我记忆,从这个网站得到它)

无论如何,这只会在开头摆脱String,而不是文件名中的那些。

另外我想使用一个单独的文件(例如badwords.txt),其中包含应该搜索和替换的所有字符串,以便我可以更新它们而无需编辑整个代码。

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

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

谢谢!

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采用shell样式模式并返回等效的正则表达式。 它用于将'.iTunes' (例如'.iTunes' )转换为正则表达式(例如r'\\.iTunes' )。
  • 您的badwords列表似乎表明您要忽略大小写。 您可以通过在pat的开头添加'(?i)'来忽略大小写:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM