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

Python Shutil模块

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

Shutil模块的工作方式

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

复制文件

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

语法-

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

参数:

在上面的语法中:

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

让我们理解以下示例。

示例-

import os  
import shutil  
  
# Creating a new folder in the current directory  
os.mkdir('Javatiku')  
  
# It will show the empty folder  
print('Empty Folder:', os.listdir('Javatiku'))  
  
# testcompare.py file will be copied in the Javatiku folder  
shutil.copy('testcompare.py', 'Javatiku')  
  
# After coping the file folder shows the file  
print('File Copied Name:', os.listdir('Javatiku'))  

输出:

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

解释:

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

让我们看另一个示例。

示例2- 如果目标是目录

import os  
import shutil  
  
# hello.txt file will be copied   
source = r'D:\Python Project\Javatiku\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)  

参数:

在上面的语法中:

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

让我们理解以下示例。

示例:

import os  
import shutil  
  
# hello.txt file will be copied   
source = r'D:\Python Project\Javatiku\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)  

参数:

在上面的语法中:

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

让我们看以下示例。

示例:

import shutil  
  
# hello.txt file will be copied   
source = r'D:\Python Project\Javatiku\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 - 它表示源目录的路径。
  • dst - 它表示目标目录的路径。
  • 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\Javatiku'  
  
# 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\Javatiku"  
  
# 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。

标签: Tkinter教程, Tkinter安装, Tkinter库, Tkinter入门, Tkinter学习, Tkinter入门教程, Tkinter, Tkinter进阶, Tkinter指南, Tkinter学习指南, Tkinter进阶教程, Tkinter编程