如何在 Python 中复制一个文件
Azaz Farooq
2023年1月30日
-
在 Python 中 Shutil
copyfile()
复制文件的方法 -
Shutil
copy()
方法复制有权限的文件 -
copy()
和copyfile()
方法的比较: -
copyfileobj()
复制文件对象的方法 -
copy2()
保存元数据的方法
Python 有几个现成的模块来支持文件 I/O 操作 (如 OS、subprocess 和 shutil)。你将简单地使用 shutil
模块复制文件和目录。复制、转移或删除文件和目录等操作都是使用这个实用功能完成的。这里讨论四种方法如下。
在 Python 中 Shutil copyfile()
复制文件的方法
它将源材料复制到一个目标文件中。如果目标文件不可写,在复制过程中会出现 IOError
异常。如果源文件和目标文件相同,则返回 SameFileError
。源文件和目标文件的路径名以字符串形式提供。
copyfile(source_file, destination_file)
本方法不支持字符或块设备和管道。
import shutil
source = r"C:\Users\DelftStack\Documents\test\test.txt"
destination = r"C:\Users\DelftStack\Pictures\test2\test2.txt"
shutil.copyfile(source, destination)
Shutil copy()
方法复制有权限的文件
copy()
方法的工作原理与 Unix 命令 cp
类似。在复制其内容时,这个方法会同步目标文件和源文件的权限。如果你复制的是同一个文件,它还会抛出 SameFileError
。它的语法如下。
shutil.copy(src_file, dest_file, *, follow_symlinks=True)
Shutil copy()
方法复制文件权限的例子
import shutil
src = r"C:\Users\DelftStack\Documents\test\test.txt"
des = r"C:\Users\DelftStack\Pictures\test2\test2.txt"
shutil.copy(src, des)
copy()
和 copyfile()
方法的比较:
copy()
方法在复制内容时往往设置文件权限,而copyfile()
只复制数据。- 本质上,在实现中,
copyfile()
方法使用了copyfileobj()
方法。相比之下,copy()
方法使用了copyfile()
和copymode()
两个函数。 - 通过以上一点可以看出,
copyfile()
会比copy()
快一点,因为后者有一个额外的工作(保留权限)。
copyfileobj()
复制文件对象的方法
该函数将文件复制到目标路径或文件的对象上。如果目标对象是文件对象,则需要直接调用 copyfileobj()
后关闭。缓冲区大小用于指定缓冲区的长度。它是指在复制的过程中,内存中保留的字节数。
copyfileobj()
方法的语法如下。
shutil.copyfileobj(src_file_object, dest_file_object[, length])
import shutil
filename1 = r"C:\Users\DelftStack\Documents\test\test.txt"
fileA = open(filename1, "rb")
filename2 = r"C:\Users\DelftStack\Pictures\test2\test2.txt"
fileB = open(filename2, "wb")
shutil.copyfileobj(fileA, fileB)
copy2()
保存元数据的方法
copy2()
方法与 copy()
方法类似,但除了复制文件内容外,它还保留了源文件的所有元数据。
shutil.copy2(src_file, dest_file, *, follow_symlinks=True)
。
import shutil
src = r"C:\Users\DelftStack\Documents\test\test.txt"
des = r"C:\Users\DelftStack\Pictures\test2\test2.txt"
shutil.copy2(src, des)
在 Python 中复制文件的方法结论
最后,附上一个表格,介绍所有的方法,以帮助更好地理解 shutil
工具。
函数 | 复制元数据 | 复制权限 | 可以使用缓冲器 | 目的地可以是目录 |
---|---|---|---|---|
shutil.copy |
没有 | 是 | 没有 | 是 |
shutil.copyfile |
没有 | 没有 | 没有 | 没有 |
shutil.copy2 |
是 | 是 | 没有 | 是的,是的 |
shutil.copyfileobj |
没有 | 没有 | 是 | 没有 |