Python实现文件名(不含扩展名)西里尔文转拉丁文重命名报错解决
问题分析与解决方案
你遇到的FileNotFoundError主要源于三个问题:
- 函数接收的
path参数未被使用,os.listdir()默认遍历当前工作目录,而非你指定的目标文件夹 - 调用
os.rename()时传入的源文件是不含扩展名的文件名,但实际文件是带扩展名的,系统找不到这个无扩展名的文件 - 用
file_name.rindex('.')分离扩展名不可靠,遇到无扩展名的文件会直接报错
修正后的代码
import os def normalize(path): CYRILLIC = ('А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч','Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я') LATIN = ('A', 'B', 'V', 'G', 'D', 'E', 'E', 'Zh', 'Z', 'I', 'Y', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'F', 'H', 'Ts', 'Ch', 'Sh', 'Sch', '', 'Y',' ', 'E', 'Yu', 'Ya') TRANSLIT_DICT = {} for c, l in zip(CYRILLIC, LATIN): TRANSLIT_DICT[ord(c)] = l TRANSLIT_DICT[ord(c.lower())] = l.lower() # 遍历传入的目标路径下的所有项 for item in os.listdir(path): # 拼接完整文件路径,避免相对路径混乱 item_full_path = os.path.join(path, item) # 仅处理文件,跳过目录 if os.path.isfile(item_full_path): # 用os.path.splitext可靠分离文件名与扩展名,兼容无扩展名文件 filename_without_ext, ext = os.path.splitext(item) # 翻译文件名部分 new_filename = filename_without_ext.translate(TRANSLIT_DICT) # 拼接新的完整文件路径 new_item_full_path = os.path.join(path, new_filename + ext) # 执行重命名操作 os.rename(item_full_path, new_item_full_path)
关键修正说明
- 全程使用完整文件路径:通过
os.path.join拼接路径,避免当前工作目录与目标路径不一致导致的文件定位错误 - 替换扩展名分离方式:用
os.path.splitext替代rindex('.'),自动兼容无扩展名的文件,不会触发索引错误 - 重命名目标正确:源文件是带扩展名的完整路径,目标文件是翻译后的文件名加上原扩展名的完整路径,确保系统能找到并正确修改文件
内容的提问来源于stack exchange,提问作者Andrii Kovalchuk
相关产品推荐
相关产品推荐

