Python Shutil模块
当您需要进行高级文件操作(例如,复制文件内容,创建文件的新副本并将其存档)时,可以使用Python shutil模块。
Python shutil
Python shutil模块使我们能够轻松处理文件对象,而无需大量研究文件对象。
它负责处理低级语义,例如创建文件对象,在复制文件后关闭文件,并使我们能够专注于程序的业务逻辑。
让我们在这里查看shutil模块。
Python shutil示例
让我们看看不同的示例,以了解shutil模块。
拷贝文件
使用shutil的copyfile()
函数,很容易将文件复制到当前目录中的新文件中。
这是一个示例程序,说明如何在当前目录中创建现有文件的新克隆:
import os import shutil print('BEFORE:', os.listdir('.')) shutil.copyfile('file_copy.py', 'file_copy.py.copy') print('AFTER:', os.listdir('.'))
让我们看一下该程序的输出:
将文件复制到当前目录
注意,copyfile()
函数采用要创建的新文件的名称。
将文件复制到另一个目录
使用shutil的copy()
函数,可以很容易地将文件复制到另一个目录。
让我们看一下如何做到这一点的代码片段:
import os import shutil os.mkdir('theitroad') print('BEFORE:', os.listdir('theitroad')) shutil.copy('file_copy.py', 'theitroad') print('AFTER:', os.listdir('theitroad'))
让我们看一下该程序的输出:
将文件复制到新目录
该函数与" copyfile()"函数不同,后者后来以文件名作为参数,而" copy()"函数则以目录名作为输入。
最后,使用这两个功能复制文件时,文件的权限也会被克隆,但不会复制元数据,这意味着创建的新文件将具有新创建的时间而不是原始文件的时间。
使用元数据复制文件
如果您需要对文件进行精确的克隆,以及文件的权限和元数据,我们可以使用copy2()函数。
请注意,这可能无法在基于POSIX的系统上完全工作。
这是有关如何使用此功能的示例程序:
import os import shutil import time def file_metadata(file_name): stat_info = os.stat(file_name) print(' Mode :', oct(stat_info.st_mode)) print(' Created :', time.ctime(stat_info.st_ctime)) print(' Accessed:', time.ctime(stat_info.st_atime)) print(' Modified:', time.ctime(stat_info.st_mtime)) os.mkdir('theitroad') print('SOURCE FILE:') file_metadata('file_copy.py') shutil.copy2('file_copy.py', 'theitroad') print('DESTINATION FILE:') file_metadata('theitroad/file_copy.py')
我们在POSIX系统上运行此功能,因此仅保留文件的模式和修改日期:
复制文件元数据(尽可能多)
在其他系统上,即使创建和访问的时间也将完全匹配。
复制完整目录
使用copytree()
函数,可以递归完全复制目录树。
这意味着,如果目录中有更多目录,该目录也将被克隆。
让我们看一下如何克隆完整目录的代码片段:
import pprint import shutil import os shutil.copytree('../shutil', './theitroad') print('\nAFTER:') pprint.pprint(os.listdir('./theitroad'))
让我们看一下该程序的输出:
递归复制目录
请注意,我们之前不会打印目录" theitroad"的内容,因为在运行此命令之前,目录名称" copytree()"作为输入的功能必须不存在。
删除目录
另一个使用shutil
的最简单的示例是删除完整目录。
无需递归删除文件或者关闭文件处理连接。
这是一个示例程序,说明使用rmtree()函数有多么容易:
import pprint import shutil import os print('BEFORE:') pprint.pprint(os.listdir('.')) shutil.rmtree('theitroad') print('\nAFTER:') pprint.pprint(os.listdir('.'))
其中我们打印当前目录的内容。
在运行脚本之前," theitroad"目录存在于当前文件夹中。
运行脚本后,它将与内容一起删除。
让我们看一下该程序的输出:
删除完整的目录树
查找文件
函数which()提供了一个很好的工具,可以在您的机器上查找PATH中存在的文件。
这是一个带有文件示例的示例程序:
import shutil print(shutil.which('bsondump')) print(shutil.which('no-such-program'))
让我们看一下该程序的输出:
在PATH上查找文件
监视文件系统空间
我们甚至可以使用disk_usage()
函数通过简单的调用获得有关文件系统中存在多少信息。
这是一个示例程序:
import shutil total_b, used_b, free_b = shutil.disk_usage('.') gb = 10 ** 9 print('Total: {:6.2f} GB'.format(total_b/gb)) print('Used : {:6.2f} GB'.format(used_b/gb)) print('Free : {:6.2f} GB'.format(free_b/gb))