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))

