Python Shutil模块

时间:2020-02-23 14:43:19  来源:igfitidea点击:

当您需要进行高级文件操作(例如,复制文件内容,创建文件的新副本并将其存档)时,可以使用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))