如何批量移除文件名非数字字符,生成ID+map格式合规文件名?
解决批量提取文件名数字ID并重命名的问题
嗨,我来帮你搞定这个批量重命名的需求!首先先给你指出原来代码里的一个小语法错误——os.path.join(dir, % title + ext)这里的%是多余的,而且字符串拼接方式不太规范,咱们先修正这个,再重点解决高效移除非数字字符提取ID的问题。
核心需求:提取纯数字ID
要从类似035 - Springfield, MA的文件名里提取出纯数字035,有两种高效的方法:
方法1:字符串过滤(简单直接)
利用字符串的isdigit()方法过滤出所有数字字符,再拼接成完整ID:
id_part = ''.join(char for char in title if char.isdigit())
这个方法代码简洁,完全适配你的场景(数字是文件名前缀,没有分散的数字)。
方法2:正则表达式(更灵活)
如果后续文件名里数字可能分散在不同位置,用正则匹配并移除所有非数字字符会更稳妥:
import re id_part = re.sub(r'\D', '', title) # \D匹配所有非数字字符,替换为空
修正后的完整重命名代码
把提取ID的逻辑整合到你的函数里,同时修正语法问题,最终代码如下:
def rename(dir_path, pattern): import glob import os import re # 如果用正则方法需要导入,用字符串过滤可删除此行 for path_and_filename in glob.iglob(os.path.join(dir_path, pattern)): filename = os.path.basename(path_and_filename) title, ext = os.path.splitext(filename) # 提取纯数字ID(二选一即可) # 方法1:字符串过滤 id_part = ''.join(char for char in title if char.isdigit()) # 方法2:正则替换 # id_part = re.sub(r'\D', '', title) # 生成新文件名:ID + map + 后缀 new_filename = f"{id_part}map{ext}" new_path = os.path.join(dir_path, new_filename) # 先打印预览(建议先测试,确认没问题再取消注释rename) print(f"重命名:{filename} -> {new_filename}") # os.rename(path_and_filename, new_path) # 调用示例 import scripts as a a.rename(r'c:\tools\storeMaps', r'*.pdf')
实用提示
- 先测试再执行:建议先保留
print语句,注释掉os.rename,确认所有新文件名都符合预期后,再执行重命名操作,避免误改文件。 - 处理重复ID:如果多个文件提取出相同的数字ID,重命名时会覆盖文件,你可以考虑在文件名后加序号(比如
035map_1.pdf)来避免冲突。 - 权限问题:确保你对目标目录有读写权限,否则会抛出权限错误。
内容的提问来源于stack exchange,提问作者CodeSpent
相关产品推荐
相关产品推荐

