这是社区交流区一位同学提出的问题,原提问链接:https://bbs.csdn.net/topics/603461429
原代码及报错:
原因及解决方案:
存在问题的代码:
这里写一些关于这个问题的小笔记供大家参考:
1、在os.rename之前先os.chdir(),在对文件重命名之前为其指定路径。
# path = 需要指定的路径 os.chdir(path) os.rename(new_file_name_list, new_file_name)
2、使用os.renames代替os.rename。os.rename仅更改了最上层目录的名称,因此,它会在“ C:\Users\ASUS\Desktop\test”中查找“ test(1).jpg”(该目录不存在嗷)。os.renames调用rename(),在调用之前,使用makedirs()递归创建目录。本质上os.renames()应该是通过makedirs()来实现递归的。
3、对于os.rename(oldpath, newpath),它的功能本质类似于把文件oldtail(文件夹或者文件均可)移到newhead文件夹下并重命名为newtail(文件或者文件夹)。它只可以更改oldtail部分,不能更改oldhead部分,即不可以更改上级目录部分。如果oldhead存在,oldtail不存在时,报错:FileNotFoundError: [WinError 2] 系统找不到指定的文件。
os.rename(oldpath,newpath) oldpath(oldhead, oldtail) newpath(newhead, newtail)
对于os.renames(oldpath, newpath),它既可以只更改oldtail部分,又可以只更改oldhead部分,还可以同时更改oldhead和oldtail,对于newpath的newhead没有限制,只要有权限访问,如果newhead不存在,直接创建。
os.renames(oldpath, newpath) oldpath(oldhead, oldtail) newpath(newhead, newtail)
学习链接:Python os.rename()和os.renames()用法的区别_Jock2018的博客-CSDN博客
4、os.listdir的文件名是相对路径(os.listdir只返回文件名);它将在当前工作目录中搜索,该目录是os.getcwd()(不会因为变量命名更改而进行更改)
修改后代码:
import os import re import sys def renameall(): fileList = os.listdir('../test_pic') print("修改前:" + str(fileList)) os.chdir('../test_pic') n = 0 for fileName in fileList: n += 1 a = '2021_backgroud' pat = ".+\.(jpg)" pattern = re.findall(pat, fileName) a = a + str(n) os.renames(fileName, (a + '.' + pattern[0])) print(os.listdir('../test_pic')) print("重命名成功") sys.stdin.flush() print("修改后:" + str(os.listdir('../test_pic'))) renameall()
运行结果: