Python(3.5) - 打开文件,正则表达式名称的一部分,重命名 - 循环

时间:2016-12-10 22:24:07

标签: python

我有一堆文件:

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)')

非常感谢任何正确方向的帮助或步骤!

1 个答案:

答案 0 :(得分:1)

只有正则表达式就在这里,不要采取错误的方式。我将解释如何修复代码以逐步重命名文件:

首先,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))