最近,在做一个项目,里面有一项需求就是对项目生成的若干个文件名称进行重命名操作。一个简单需求,基础知识掌握不牢固,实现起来往往很费时间。
需要基础哦
下面,和大家一起来探讨下Python中重命名文件的几个常用方法,使大家在以后遇到类似问题时,少踩坑。为了便于大家理解掌握,最后和大家分享一个自己编写的案例。
开始了
不废话,开始吧!
01使用内置os模块的rename方法
需要导入os模块
import os
重命名文件
os.rename(source,destinate)
source-源文件或者文件夹
destinate-目标文件或者文件夹
下面是重点哦
需要说明的几个问题:
rename功能并非“重命名”这一单一功能。此外,它兼具复制并重命名。如果你想将文件重命名后复制到另一个文件夹下,直接使用rename也可以实现这一功能。比如,我想把当前目录中文件test重命名为test2并复制到当前文件夹bob下。可使用os.rename('test', 'bob\\test2')
重命名文件或者文件夹时,如果文件或者文件夹在目标中已存在,则抛出FileExistsError异常,提示无法创建文件,重命名失败。
这点很好理解,跟着系统走
source或destinate不存在时抛出FileNotFoundError异常。
找不到肯定无法重命名了
当把文件夹移动到该文件夹内并重命名时,抛出PermissionError异常,这点务必注意(项目如果有此需求,要另辟蹊径)。
内部嵌套很容易引发问题哦
如果该文件(文件夹)是隐藏文件(文件夹),这一方法同样可以找到并重命名该文件(这一点很神奇,大家记住的话能做很多事!)
02使用内置库shutil的move方法
我们知道shutil的主要作用其实是拷贝文件。当我们拷贝过程中改变文件或文件夹名称也就间接实现了文件或文件夹重命名的功能。示例如下:
使用讲解
shutil在处理文件和文件夹过程中,同os模块不同之处在于,shutil处理移动、复制文件(文件夹)操作时,更加灵活,我们来看下面几个例子。
不改变文件名称,直接移动文件数据。看下面的例子,假定我们有文件1、文件2两个文件,内容如下
文件1、文件2内容
当我们执行下面代码
f1 = open('文件1.txt')
f2 = open('文件2.txt', 'w')
shutil.copyfileobj(f1,f2)
f1.close()
f2.close()
后打开文件1、文件2进行对比。
执行后文件1、文件2内容对比
可以看到,文件1的数据覆盖copy给文件2,shutilfileobj方法可以处理文件流,并不是单纯重命名文件这么简单(os.rename方法是不可以向已经存在的文件写入数据的)。
如果确定重命名过程中不需要文件数据交互,则直接使用copyfile方法shutil.copyfile(文件1,文件2):不用打开文件,直接用文件名进行覆盖copy(注意这里是覆盖copy)
同上例,我们进行对比分析,注意文件1、文件2内容有变化
执行前
执行shutil.copyfile('文件1.txt', '文件2.txt')后结果如下
执行后文件对比
shutil甚至可以拷贝源文件的权限(使用copystat方法)、文件和状态信息(copy2)等。
这里小伙伴可能有疑虑了,我们探讨的是文件重命名,为什么shutil举一大堆copy的例子?呵呵,大家仔细想想copy后改变文件名称不就实现重命名的功能了吗?
复制和重命名
延伸扩展,对于文件夹重命名,使用shutil.move(源文件,指定路径),可以实现递归移动一个文件(当然重命名也不在话下)。这里递归移动就是说它不像os.rename()方法,作为文件夹,它可以自己把自己移动到自己内部!呵呵,很绕口……
03os.rename方法和shutil.copyfile方法对比
从上面的例子对比我们看到,os.rename()和shutil.copyfile()都可以实现文件重命名的功能即使存在文件2,将同一目录下文件1重命名为文件夹2后,使用shutil.copyfile方法会覆盖保存。这是shutil.copy方法和os.rename方法的不同之处shutil.move方法可以实现文件夹的递归移动,这里不做演示,大家自己试验
shutil.copyfile比os.rename更加灵活
相比之下,shutil.copyfile方法更加灵活,它可以将文件处理后进行重命名哦,这点很有用!
04一个很有意思的案例
接下来,我们在一个文件夹下创建1000个随机文件,然后使用shutil方法重命名这些文件。来形象了解下文件重命名过程。
不赘述,直接上代码
案例代码
我们来看下运行效果,如下图
使用createTxtFile()函数随机生成100个文件
随机生成100个文件
重命名文件后效果展示
重命名文件,加入文件编号
好了,今天的内容就到这里,喜欢Python编程的小伙伴关注我,后续推出更加精彩的实例展示。
欢迎下方留言!本文为作者原创,转载请私信联系作者!