shutil.copy 不会将文件复制到新位置,它会覆盖文件。
将文件 src 复制到文件或目录 dst。如果 dst 是一个目录,
创建(或覆盖)与 src 具有相同基本名称的文件
指定的目录。许可位被复制。 src 和 dst 是
以字符串形式给出的路径名。
因此,您必须自行检查目标文件是否存在并根据需要更改目标。例如,您可以使用以下方法来实现安全复制:
def safe_copy(file_path, out_dir, dst = None):
"""Safely copy a file to the specified directory. If a file with the same name already
exists, the copied file name is altered to preserve both.
:param str file_path: Path to the file to copy.
:param str out_dir: Directory to copy the file into.
:param str dst: New name for the copied file. If None, use the name of the original
file.
"""
name = dst or os.path.basename(file_path)
if not os.path.exists(os.path.join(out_dir, name)):
shutil.copy(file_path, os.path.join(out_dir, name))
else:
base, extension = os.path.splitext(name)
i = 1
while os.path.exists(os.path.join(out_dir, '{}_{}{}'.format(base, i, extension))):
i += 1
shutil.copy(file_path, os.path.join(out_dir, '{}_{}{}'.format(base, i, extension)))
在这里,'_number' 插入到扩展名之前,以生成唯一的目标名称以防重复。喜欢'foo_1.txt'。