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

Python 删除文件名中最后一个下划线之前的所有字符_,python,python-3.x,Python,Python 3.x,如何从CWD中递归的所有文件名中删除.ext前面最后一个下划线之前的所有字符 这最好是通过split-and-replace或regex(^[^\uuz]+\uu?)来实现的吗?下面的代码不起作用(无错误消息。) 代码: 我认为拆分是最简单的方法,尽管我不确定你为什么需要替换 既然您是从path.join开始的,为什么不先“更正”文件名,然后再加入路径呢?现在看起来您正在创建“错误”的文件路径,然后返回并修改它们 filename = filename.split('_')[-1] 这会将文件

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

这最好是通过split-and-replace或regex(
^[^\uuz]+\uu
?)来实现的吗?下面的代码不起作用(无错误消息。)

代码:


我认为拆分是最简单的方法,尽管我不确定你为什么需要替换

既然您是从path.join开始的,为什么不先“更正”文件名,然后再加入路径呢?现在看起来您正在创建“错误”的文件路径,然后返回并修改它们

filename = filename.split('_')[-1]
这会将文件名拆分为字符串列表(沿每个“389;”)并返回最后一个条目,例如上面第一个示例中的“xxx.txt”。

您的代码错误:

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)

path.replace(^[^\u]+\u)
?什么????这是无效的,并且replace不支持正则表达式。谢谢,有什么建议吗?最好的方法是什么?
'aaa\u bbb\u 000\u xxx.txt'。split('uu')[-1]
请注意,您不应该编辑您的问题以反映答案所做的建议,因为它会完全关闭答案。我恢复到以前的版本,只是修复了丢失的报价输入错误。现在我也要更新我的答案了。谢谢。我将代码与
path=os.getcwd()
一起使用,但我遇到了一个错误:`namererror:name'paths'未定义。我有一个非常类似的解决方案,但你抢先一步+1@HakariDo你仍然需要你的gencomp:
path=(os.path.join(cwd,filename)用于cwd,u,os.walk中的文件名(cwd)用于文件名中的文件名)
我在OP中更新运行,并且得到:name错误名称“re”未定义。
import re
添加。使用
filename=filename.split如何进行实际重命名(“”“)[-1]
您可以尝试:newname=os.path.basename(path).split(“”“)[-1](代替当前的newname行)
re.sub(".*_","",s)
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)