Python Shutil.copy如果我有一个重复的文件,它将复制到新的位置

时间:2015-10-22 13:48:54

标签: python shutil

我正在使用python中的shutil.copy方法

我找到了下面列出的定义

def copyFile(src, dest):
    try:
        shutil.copy(src, dest)
    # eg. src and dest are the same file
    except shutil.Error as e:
        print('Error: %s' % e)
    # eg. source or destination doesn't exist
    except IOError as e:
         print('Error: %s' % e.strerror)

我正在循环中访问定义。循环基于每次更改的字符串。代码查看目录中的所有文件,如果它看到文件中字符串的一部分,则将其复制到新位置

我很确定会有重复的文件。所以我想知道会发生什么。他们会复制吗,他们会失败吗

1 个答案:

答案 0 :(得分:3)

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'一样。