何时从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)
答案 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'代表上面的第一个例子。