Python中的Shutil模块

Python中的Shutil模块

在本教程中,我们将学习Python中的Shutil模块。我们将讨论如何执行高级文件操作,例如创建新的副本文件并存档以及使用Python脚本将一个文件的内容复制到另一个文件中。让我们对Shutil模块进行基本介绍。

Python Shutil模块

Python的shutil模块提供了执行高级文件操作的功能。它可以与文件对象一起使用,并提供了复制和删除文件的能力。它处理低级语义,如在执行所有操作后创建和关闭文件对象。

Shutil模块的工作方式

Python的shutil模块带有许多内置方法。我们将探讨一些重要的方法。要开始使用此模块,首先需要在当前的Python文件中导入它。

复制文件

该模块提供了 copy() 函数,用于从一个文件复制数据到另一个文件。这些文件必须在同一个目录中,并且目标文件必须可写。让我们了解以下语法。

语法-

shutil.copyfile(source, destination, *, follow_symlinks = True)

参数:

在上述语法中 –

  • 第一个参数是源,显示源文件的路径。
  • 第二个参数是目标,显示目标文件的路径。
  • 第三个参数是可选的;此参数的默认值为true。
  • 它返回一个字符串,显示新创建文件的路径。

让我们看以下示例。

示例

import os
import shutil

# Creating a new folder in the current directory
os.mkdir('javatpoint')

# It will show the empty folder
print('Empty Folder:', os.listdir('javatpoint'))

# testcompare.py file will be copied in the javatpoint folder
shutil.copy('testcompare.py', 'javatpoint')

# After coping the file folder shows the file
print('File Copied Name:', os.listdir('javatpoint'))

输出:

Empty Folder: []
File Copied Name: ['testcompare.py']

解释 –

copy() 函数以目录名称作为参数。在这里, metadata 不会被复制,复制的文件将被视为新创建的文件。该方法还克隆了文件的所有权限。需要注意的一点是,如果目标文件已经存在,它将被源文件替换。

让我们看另一个示例。

示例2 如果目标是一个目录

import os
import shutil

# hello.txt file will be copied 
source = r'D:\Python Project\javatpoint\hello.txt'

# In the newly created foloder
destination = r'D:\Python Project\NewFile'

# Storing the new path of hello.txt file
dest = shutil.copy(source, destination)

# Print the new path
print(dest)

输出:

D:\Python Project\NewFile\hello.txt

如上所述,copy()函数不会复制元数据。但是,我们将使用 copy2() 函数,它允许我们复制包括元数据的文件。

示例3:在使用复制方法时进行错误处理

# importing shutil module
import shutil

# It is a source path
source = r"D:\Python Project\NewFolder"

# It is a destination path
destination = r"D:\Python Project\NewFolder"

try:
    shutil.copy(source, destination)
    print("File copied successfully.")

# If the given source and path are same
except shutil.SameFileError:
    print("Source and destination represents the same file.")

# If there is no permission to write
except PermissionError:
    print("Permission denied.")

# For other errors
except:
    print("Error occurred while copying file.")

输出:

Source and destination represents the same file.

copy2()函数

这个函数与 copy() 函数类似。它也可以将一个文件的内容复制到另一个文件,但唯一的区别是它可以保留文件的元数据。让我们了解以下语法。

语法:

shutil.copy2(source, destination, *, follow_symlinks = True)

参数:

在以上语法中 –

  • 第一个参数是源文件的路径。
  • 第二个参数是目标文件的路径。
  • 第三个参数是可选的,其默认值为true。
  • 它返回一个字符串,其中包含新创建文件的路径。

让我们了解以下示例。

示例

import os
import shutil

# hello.txt file will be copied 
source = r'D:\Python Project\javatpoint\hello.txt'

metadata = os.stat(source)
print(metadata)

# In the newly created foloder
destination = r'D:\Python Project\NewFile'
# Storing the new path of hello.txt file

dest1 = shutil.copy2(source, destination)
metadata = os.stat(dest1)

print("After copying file")
print(metadata)

# Print the new path
print(dest1)

输出:

os.stat_result(st_mode=33206, st_ino=562949953459285, st_dev=3029671014, st_nlink=1, st_uid=0, st_gid=0, st_size=17, st_atime=1622815671, st_mtime=1622705607, st_ctime=1622705607)
After copying file
os.stat_result(st_mode=33206, st_ino=562949953459287, st_dev=3029671014, st_nlink=1, st_uid=0, st_gid=0, st_size=17, st_atime=1622815748, st_mtime=1622705607, st_ctime=1622706243)
D:\Python Project\NewFile\hello.txt

shutil.copyfile() 函数

此方法用于将源文件的内容复制到目标文件中,除了元数据以外。源文件和目标文件必须都是文件,并且目标文件必须具有写入权限。如果目标文件已经存在,则将被新文件替换,否则将创建新文件。

请查看以下语法。

语法:

shutil.copyfile(source, destination, *, follow_symlinks = True)

参数:

在上面的语法中 –

  • 第一个参数是源文件的路径。
  • 第二个参数是目标文件的路径。
  • 第三个参数是可选的;这个参数的默认值是true。
  • 它返回一个字符串,显示新创建文件的路径。

让我们理解以下示例。

示例

import shutil

# hello.txt file will be copied 
source = r'D:\Python Project\javatpoint\hello.txt'

# In the newly created foloder
destination = r'D:\Python Project\NewFile\hi.txt'
# Storing the new path of hello.txt file

dest1 = shutil.copyfile(source, destination)

# Print the new path
print(dest1)

输出:

D:\Python Project\NewFile\hi.txt

shutil.copytree()函数

该方法用于复制完整的目录。它将源目录下的整个目录结构复制到目标目录下。目标目录不能已经存在。以下是其语法。

语法:

shutil.copytree(src, dst, symlinks = False, ignore = None, copy_function = copy2, igonre_dangling_symlinks = False)

参数:

在上面的语法中:

  • src – 它显示源目录的路径。
  • dest – 它显示目标目录的路径。
  • symlinks(可选) – 它接受布尔值 – True 和 False。它取决于要将原始链接或链接的元数据复制到新树中。
  • ignore(可选) – 默认值为None,但如果传递了ignore,则它必须是一个可调用的,它以其参数接收copytree()访问的目录。
  • copy_function(可选) – copy2是该参数的默认值。可以将copy()函数用作参数。
  • ignore_dangling_symlinks(可选) – 此参数用于在符号链接指向的文件不存在时引发异常。
  • 它返回表示新创建目录路径的字符串。

示例

# importing shutil module
import shutil

# It is source path
src = r'D:\Python Project\javatpoint'

# It is destination path
dest = r'D:\Python Project\NewFolder'

# Copy the content of
# source to destination
dest1 = shutil.copytree(src, dest)

# Now we print path of newly
# created file
print("Destination path:", dest1)

输出:

Destination path: D:\Python Project\NewFolder

shutil.rmtree()

这个方法用于删除整个目录树。让我们看一下以下的语法。

语法:

shutil.rmtree(path, ignore_errors=False, onerror=None)

参数 –

在上述语法中 –

  • path – 它表示文件路径。路径对象可以是字符串或字节对象。
  • ignore_errors – 如果该参数为True,则忽略删除操作。
  • onerror – 如果 ignore_errors 为false,将通过调用onerror指定的处理程序来处理此类错误。

让我们来看下面的示例 –

示例

import shutil
import os

# location
location_dir = r"D:\Python Project\NewFile"

# directory
directory = r"D:\Python Project\javatpoint"

# path
path1 = os.path.join(location_dir, directory)

# removing directory
shutil.rmtree(path1)

此代码将删除给定的目录。

shutil.which() 函数

shutil.which() 函数用于获取执行给定 cmd 命令时要运行的可执行应用程序的路径。它在给定的路径中找到该文件。让我们看看以下的语法。

语法:

shutil.which(cmd, mode = os.F_OK | os.X_OK, path = None)

参数

在上述语法中 –

  • cmd – 它是表示文件的字符串。
  • mode – 它指定应在其中执行方法的文件的模式。
  • path – 此参数指定要使用的路径。
  • 该方法返回可执行应用程序的路径。

让我们了解以下示例。

示例

# importing shutil module
import shutil

# search the file
cmd = 'python'

# Using shutil.which() method
locating = shutil.which(cmd)

# Print result
print(locating)

输出:

C:\Python\python.EXE

它将在计算机中找到给定的文件,如果找到文件则返回文件的路径,否则返回None。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程