shutil
模块提供了一系列高级文件操作功能,包括复制、移动、删除和搜索文件或目录。shutil 模块对压缩包的处理是调用 ZipFile 和 TarFile这两个模块来进行的。
下面详细介绍并给出示例代码:
1. shutil.copy(src, dst)
复制文件,但不保留权限和时间戳等元数据。
import shutil
src = "source.txt"
dst = "destination.txt"
shutil.copy(src, dst)
print(f"File copied from {src} to {dst}.")
2. shutil.copy2(src, dst)
复制文件并保留权限、时间戳等元数据。
import shutil
src = "source.txt"
dst = "destination2.txt"
shutil.copy2(src, dst)
print(f"File copied from {src} to {dst} with metadata.")
3. shutil.copyfileobj(fsrc, fdst)
从一个文件对象复制数据到另一个文件对象。通常用于大文件的复制,因为它可以避免一次性读取整个文件到内存中。
import shutil
import os
src = "source.txt"
dst = "destination_fileobj.txt"
with open(src, 'rb') as fsrc:
with open(dst, 'wb') as fdst:
shutil.copyfileobj(fsrc, fdst)
print(f"File copied from {src} to {dst} using copyfileobj.")
4. shutil.copyfile(src, dst)
复制文件的内容,但不包括元数据(如权限和时间戳)。与shutil.copy()
类似,但不会复制文件的权限和时间戳。
import shutil
src = "source.txt"
dst = "destination_file.txt"
shutil.copyfile(src, dst)
print(f"File content copied from {src} to {dst} without metadata.")
区别:shutil.copyfile()
vs shutil.copyfileobj()
copyfile()
:适用于文件路径,直接从源文件复制到目标文件。copyfileobj()
:适用于文件对象,适合处理大文件或流式复制,因为它可以避免一次性加载整个文件到内存中。
5. shutil.copytree(src, dst)
递归复制目录及其所有子目录和文件。
import shutil
src = "source_directory"
dst = "destination_directory"
shutil.copytree(src, dst)
print(f"Directory {src} copied to {dst}.")
6. shutil.rmtree(path)
递归删除目录及其所有子目录和文件。
import shutil
path = "destination_directory"
shutil.rmtree(path)
print(f"Directory {path} removed recursively.")
7. shutil.move(src, dst)
移动文件或目录,也可以用于重命名文件或目录。
import shutil
src = "source.txt"
dst = "moved_source.txt"
shutil.move(src, dst)
print(f"File {src} moved to {dst}.")
8. shutil.which(cmd, mode=os.F_OK | os.X_OK, path=None)
在PATH环境变量中查找可执行文件的位置。类似于Unix的which
命令。
import shutil
cmd = "python"
result = shutil.which(cmd)
if result:
print(f"{cmd} found at {result}")
else:
print(f"{cmd} not found.")
9. shutil.copyfileobj(fsrc, fdst[, length])
从一个文件对象fsrc
复制数据到另一个文件对象fdst
。这通常用于大文件的复制,因为它可以避免一次性读取整个文件到内存中。
import shutil
with open('file1.txt', 'rb') as src:
with open('file2.txt', 'wb') as dst:
shutil.copyfileobj(src, dst)
10. shutil.copyfile(src, dst)
复制文件的内容,但不包括元数据(如权限、所有权和时间戳)。它直接从源文件路径复制到目标文件路径。
import shutil
shutil.copyfile('file1.txt', 'file2.txt')
11. shutil.copymode(src, dst)
复制文件的模式(权限),但不复制文件内容或所有权。如果目标文件已存在,它的权限将被更新为与源文件相同。
import shutil
shutil.copymode('file1.txt', 'file2.txt')
12. shutil.copystat(src, dst)
复制文件的所有状态信息,包括权限、组、用户和时间戳,但不包括文件内容。如果目标文件已存在,它的状态信息将被更新为与源文件相同。
import shutil
shutil.copystat('file1.txt', 'file2.txt')
13. shutil.copy(src, dst)
复制文件的内容和权限。相当于先执行了copyfile
再执行了copymode
。
import shutil
shutil.copy('file1.txt', 'file2.txt')
14. shutil.copy2(src, dst)
复制文件的内容及其所有状态信息。相当于先执行了copyfile
再执行了copystat
。
import shutil
shutil.copy2('file1.txt', 'file2.txt')
15. shutil.copytree(src, dst[, symlinks=False[, ignore=None]])
递归复制整个目录树。symlinks
参数决定是否复制符号链接,ignore
参数可以指定一个函数来忽略某些文件或目录。
import shutil
shutil.copytree('source_directory', 'destination_directory')
其他方法
shutil.move(src, dst)
移动文件或目录。这类似于重命名操作,但可以在不同的文件系统之间移动。
import shutil
shutil.move('file1.txt', 'new_directory/')
shutil.make_archive(base_name, format, root_dir[, base_dir[, owner[, group[, dry_run[, logger]]]]])
创建存档文件,如zip或tar包。
import shutil
shutil.make_archive('archive', 'zip', 'directory_to_compress')
shutil.unpack_archive(filename[, extract_dir[, format]])
解压缩存档文件。
import shutil
shutil.unpack_archive('archive.zip', 'extracted_directory')
shutil.which(cmd[, path])
在环境变量PATH
中查找可执行文件的位置,类似于Unix的which
命令。
import shutil
print(shutil.which('python'))
通过以上示例,你应该能够理解和使用shutil
模块中的一些关键方法。这些方法提供了比os
模块更高级的文件和目录操作功能,适合于需要进行复杂文件管理的任务。
引用链接:Python模块——shutil模块详解_数据分析与统计学之美-GitCode 开源社区 (csdn.net)