创建用于shutil.copy文件的目标路径

11 浏览
0 Comments

创建用于shutil.copy文件的目标路径

如果路径(例如b/c/)在./a/b/c中不存在,则shutil.copy(\"./blah.txt\", \"./a/b/c/blah.txt\")将抱怨目标路径不存在。创建目标路径并将文件复制到该路径的最佳方法是什么?

0
0 Comments

在使用shutil.copy复制文件时,如果目标路径不存在,会出现OSError: [Errno 2] No such file or directory错误。这是因为在Python 2.7中,使用os.mkdir创建目录时,如果父目录不存在,则会报错。为了解决这个问题,可以使用os.makedirs代替os.mkdir,它会自动创建父目录。然而,os.makedirs也存在一个竞争条件的问题,即在检查目录存在与否和调用os.makedirs之间,其他线程或进程可能会创建该目录。为了更好地解决这个问题,可以直接调用os.makedirs,并在目录已存在时捕获异常。可以在Stack Overflow上查找有关目录创建的更多信息。

0
0 Comments

问题的出现原因是使用shutil.copy函数时,如果目标文件夹不存在,会报错。为了解决这个问题,可以使用os.makedirs函数来创建目标文件夹的目录树。需要注意的是,只有在Python 3.2及以上版本中,os.makedirs函数才支持exists_ok参数来避免已存在文件夹的报错。此外,需要注意的是,正确的参数名是exist_ok,而不是exists_ok。因此,解决该问题的方法是使用os.makedirs函数创建目标文件夹的目录树,并正确设置exist_ok参数。以下是代码示例:

import os
import shutil
def create_destination_path(path):
    os.makedirs(path, exist_ok=True)
    
# 示例调用
create_destination_path("path/to/destination")

使用上述代码可以创建目标文件夹的目录树,如果目标文件夹已存在,则不会报错。

0
0 Comments

问题:

根据提供的答案和评论,总结如下:

对于Python 3.2+:

在使用copy之前,使用os.makedirs并设置exist_ok=True来创建目标路径:

os.makedirs(os.path.dirname(dest_fpath), exist_ok=True)
shutil.copy(src_fpath, dest_fpath)

对于Python < 3.2:

在捕获IOError后,使用os.makedirs再次尝试复制:

try:
    shutil.copy(src_fpath, dest_fpath)
except IOError as io_err:
    os.makedirs(os.path.dirname(dest_fpath))
    shutil.copy(src_fpath, dest_fpath)

尽管在makedirs之前检查errno和/或在makedirs之前检查路径是否存在可能更加明确,但在我看来,这些代码片段在简单性和功能性之间取得了很好的平衡。

奇怪的是,文件复制和目录创建分别位于两个不同的模块中。

原因:

问题的出现是因为在复制文件之前,需要先创建目标路径,但是在不同版本的Python中,处理这个问题的方式不同。

解决方法:

对于Python 3.2+,可以使用os.makedirs函数来创建目标路径,然后再使用shutil.copy函数进行文件复制。需要注意的是,在创建路径时需要设置exist_ok=True,以确保如果路径已存在也不会抛出异常。

对于Python < 3.2,需要在复制文件之前捕获IOError异常,并使用os.makedirs函数创建目标路径。然后再次尝试进行文件复制。

尽管代码中可以添加更多的错误处理,如检查errno和路径是否存在,但以上代码片段在简单性和功能性之间取得了很好的平衡。

可以注意到,奇怪的是,在Python中,复制文件和创建目录的功能分别位于两个不同的模块中。

0