[英]Python (3.5) - Open File, Regex part of name, Rename - Loop
我有一堆文件:
File Completed for 123456 1 - Platform Junk (AP .msg
File Completed for 1234566 1 - More Junk here and Stuf.msg
File Completed for 654321 1 - ® Stuff and Junk.msg
因此,每个文件都包含6或7位数字(不包括数字后的1
),有些文件也具有愚蠢的R(注册商标)符号。
我的目标是在当前目录中搜索所有.msg
文件,找到6或7位数字,然后将文件重命名为123456.msg
或11234567.msg`。
我有应该正确工作的正则表达式来提取数字:
(?<!\\d)(\\d{6}|\\d{7})(?!\\d)
现在,我只需要遍历所有.msg文件并重命名它们。 我已经开始使用以下代码,但是我不太了解如何提取想要的内容并重命名:
for filename in glob.glob(script_dir + '*.msg'):
new_name = re.sub(r'(?<!\d)(\d{6}|\d{7})(?!\d)')
任何帮助或朝着正确方向迈出的步伐将不胜感激!
只有正则表达式在这里,不要以错误的方式使用它。 我将逐步解释如何修复代码以重命名文件:
首先, glob
模式应使用os.path.join
编写,否则您必须以/
结束script_dir
:
for filename in glob.glob(os.path.join(script_dir,'*.msg')):
让我们测试一下您的正则表达式,使其仅保留正则表达式匹配并删除其余部分:
>>> re.sub(r".*((?<!\d)(\d{6}|\d{7})(?!\d)).*",r"\1.msg","File Completed for 1234566 1 - More Junk here and Stuf.msg")
'1234566.msg'
好的,既然可以了,那么就可以像下面这样计算新名称:
base_filename = os.path.basename(filename)
new_name = re.sub(r".*((?<!\d)(\d{6}|\d{7})(?!\d)).*",r"\1.msg",base_filename) # keep only matched pattern, restore .msg suffix in the end
因此正则表达式仅适用于文件名,不适用于完整路径
最后,使用os.rename
重命名文件(检查是否已替换某些内容,否则重命名将失败,因为source == dest:
if base_filename != new_name:
os.rename(filename,os.path.join(script_dir,new_name))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.