Python教程-Python中的Shutil模块
在这个教程中,我们将学习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。