前言
熟悉Windows
系统的同学肯定对于用鼠标右键对文件进行复制粘贴删除操作都很熟悉,有一些同学也许会熟悉命令行的批处理命令,比如copy
、rm
等,其实利用Python
内置的标准模块或部分第三方模块也很容易实现对文件的复制、删除、重命名,甚至对于文件夹的操作也有相当简洁的命令,这一篇文章我们就来看一下如何利用Python
来对文件系统进行通用操作。
复制文件和文件夹
这主要是用到shutil
这个模块,它是Python
内置的标准模块,在前面的一些文章中,我们有提及到该模块,这里来看一下用该模块如何对一个文件进行复制粘贴操作:
import shutil, osfrom pathlib import Pathpath = Path.cwd() ## 获取当前目录路径shutil.copy(path/'foo.txt', path/'foo')
上述
shutil.copy
命令将
foo.txt
复制到当前目录的
foo
文件夹下面,当然这是因为事先在当前文件夹下存在一个
foo
文件夹,如果没有
foo
文件夹,那么上述语句会将
foo.txt
文件复制到当前文件夹下,并将新文件命名为
foo
。
下面我们再来看一下如何复制一个文件夹,比如要将当前文件夹下的foo
文件夹复制在当前目录下,并命名为bar
:
shutil.copytree(path/'foo', path/'bar')
移动并重命名文件和文件夹
这个shutil
模块还有一个move
方法,它可以移动并重命名文件和文件夹,下面举例说明:
shutil.move(path/'foo.txt', path/'foo2.txt')
上述语句执行完后,当前目录下已经没有
foo.txt
文件,原文件已经变成了
foo2.txt
,当然也可以将
foo2.txt
移动到
foo
文件夹中:
shutil.move(path/'foo2.txt', path/'foo'/'foo3.txt')
通过上述语句,我们可以将当前文件夹中的
foo2.txt
移动到当前目录的
foo
文件夹下,并将其命名为
foo3.txt
。
永久删除文件和文件夹
为了删除当前文件夹下的一个文件,可以用os.unlink
方法进行删除;如果要删除一个文件夹,且文件夹中有文件的话,就不能用os.rmdir
方法,因为该方法只能删除空文件夹,此时要用到shutil.rmtree
,比如删除当前文件夹下的foo.txt
:
os.unlink('foo.txt')
再来删除当前目录中的
foo
文件夹,此时的
foo
文件夹中有文件,我们先用
os.rmdir
试试:
os.rmdir('foo')
提示说该目录不空,因此删除失败,这时就要用到shutil.rmtree
:
shutil.rmtree('foo')
这句语句就直接删除了当前目录中的
foo
文件夹。
这样直接删除属于永久删除,即语句执行完毕后,硬盘上就找不到原文件或文件夹了,现实情况是我们往往不想一下子将文件删除,最好是先删除到回收站里,这样即使删除错了,也可以恢复,那么Python
中是如何完成这个功能呢?
安全删除文件模块
为了将文件只删除到回收站里,我们需要用到一个第三方模块send2trash
,它可以将文件或是文件夹发送到回收站而非直接永久删除,这为我们的安全删除提供了保障:
import send2trashsend2trash.send2trash('foo.txt')
上述语句执行完后,当前目录下已经没有
foo.txt
文件,但其在回收站里依然存在。
遍历目录树
我们可以用os.walk
方法来递归遍历一棵目录树,比如我们来列写一下当前目录中存在的文件:
for folderName, subfolders, filenames in os.walk(Path.cwd()): print(f"==================\n文件夹:{folderName}") for subfolder in subfolders: print(f"子文件夹:{folderName} {subfolder}") for filename in filenames: print(f"文件:{folderName} {filename}")
从上述输出结果可以看出,文件夹的遍历是如何进行的。
压缩文件
在实际工作和学习中,压缩文件是我们经常用到的,同学们都有自己常用的压缩软件,那么在Python
中是如何实现压缩文件呢?
在Python
中,压缩文件的读写需要用到第三方模块zipfile
,该模块可以很容易对文件进行压缩和解压操作,下面我们先来将当前目录下的foo.txt
添加到一个压缩文件foo.zip
中:
import zipfilewith zipfile.ZipFile('foo.zip', 'w') as f: f.write('foo.txt', compress_type=zipfile.ZIP_DEFLATED)
此时我们来查看当前目录,一定会发现出新了一个新的名为
foo.zip
的压缩文件,下面我们再来演示一下如何查看
foo.zip
中有哪些文件被压缩在其中:
with zipfile.ZipFile('foo.zip') as f: print(f.namelist()) >>> 输出:['foo.txt']
接着我们再来看一下如何将
foo.zip
进行解压缩:
with zipfile.ZipFile('foo.zip') as f: f.extractall()
为了更清楚测试效果,可以事先将当前目录下的
foo.txt
删除,再运行上述代码,运行完成后,即会发现在当前目录下出现了一个新的
foo.txt
文件。
要注意:extractall
默认是将压缩文件中的内容全部提取到当前目录中,如果想指定解压缩目录,需要为其指定路径,比如:
with zipfile.ZipFile('foo.zip') as f: f.extractall('foo')
此时再来查看,即可发现当前目录中多了一个新的foo
文件夹,而压缩文件中的foo.txt
即存在于文件夹foo
中。
小结
本文对于如何利用Python
中的模块对文件或文件夹的复制、移动、重命名、遍历以及压缩和解压缩等常用文件操作方法进行了介绍,在开发一些系统时,有时候会用到这些内容,尤其是这些模块在不同的平台上没有什么差异,这更有助于我们将开发的程序进行跨平台移植。