删除最后一个下划线前的文件名中的所有字符_

时间:2017-11-11 21:21:06

标签: python python-3.x

何时从CWD中递归的所有文件名中删除_之前的最后一个下划线.ext的所有字符?

这最好通过拆分和替换或正则表达式(^[^_]+_?)来完成吗?下面的代码不起作用(没有错误消息)

aaa_bbb_000_xxx.txt   ---> xxx.txt
__abc123_zzzz.txt     ---> zzzz.txt
111222.txt            ---> 111222.txt

代码:

import os

cwd = os.getcwd()

paths = (os.path.join(cwd, filename)
        for cwd, _, filenames in os.walk(cwd)
        for filename in filenames)

for path in paths:
    newname = path.replace("^[^_]+_")
    if newname != path:
        os.rename(path, newname)

2 个答案:

答案 0 :(得分:2)

你的代码错了:

for path in paths:
    newname = path.replace("^[^_]+_")

str.replace不支持正则表达式(并且需要另一个参数:空字符串)和(主要问题),您的正则表达式无法正常工作,因为path已满目录的路径,因此^无法正常工作。

另外,你的正则表达式不起作用。你只想删除所有字符,直到下划线(贪婪模式),这样才能起作用:

re.sub(".*_","",s)

我会使用basename来应用替换,然后将其连接回完整路径。另请注意,如果目标文件名存在,os.rename将失败。我已经加入了保护措施。

以下代码分解了我的方法:

import re
for path in paths:
    the_dir = os.path.dirname(path)
    newname = re.sub(".*_","",os.path.basename(path))
    newpath = os.path.join(the_dir,newname)
    if path != newpath:
        if os.path.exists(newpath):
           print("Warning: cannot rename into {}".format(newpath))
        else:
           os.rename(path,newpath)

答案 1 :(得分:1)

我认为拆分是最简单的方法,但我不确定你为什么需要更换。

既然你开始使用path.join,为什么不首先“更正”文件名然后加入路径?现在看起来你正在制作“错误的”文件路径,然后返回并修改它们。

filename = filename.split('_')[-1]

将文件名拆分为字符串列表(沿着每个“_”)并返回最后一个条目,例如: 'xxx.txt'代表上面的第一个例子。