du_util.copy_tree在shutil.rmtree之后失败

tas*_*tas 8 python

我在尝试将文件夹删除后将其复制到另一个文件夹:

for i in range(0,3):
   try:
      dir_util.remove_tree("D:/test2")
 #     shutil.rmtree("D:/test2")
      print "removed"
   except: pass

   dir_util.copy_tree("D:/test1", "D:/test2")

   print i
Run Code Online (Sandbox Code Playgroud)

D:/ test1包含一个名为test_file的空文件.如果我使用dir_util.remove_tree它工作正常,但在shutil.rmtree之后它只能工作一次,在第二次迭代时它会失败.输出:

removed
0
removed
Traceback (most recent call last):
  File "test.py", line 53, in <module>
    dir_util.copy_tree("D:/test1", "D:/test2")
  File "C:\Python27\lib\distutils\dir_util.py", line 163, in copy_tree
    dry_run=dry_run)
  File "C:\Python27\lib\distutils\file_util.py", line 148, in copy_file
    _copy_file_contents(src, dst)
  File "C:\Python27\lib\distutils\file_util.py", line 44, in _copy_file_contents
    fdst = open(dst, 'wb')
IOError: [Errno 2] No such file or directory: 'D:/test2\\test_file'
Run Code Online (Sandbox Code Playgroud)

使用shutil.rmtree比较方便,因为它允许删除只读文件的错误处理.dir_util.remove_tree和shutil.rmtree有什么区别?为什么copyttree在rmtree第二次之后没有工作?

我在Windows 7上运行Python 2.7.2

Dik*_*rAz 17

似乎是distutils中的一个错误.如果您复制文件夹,然后删除它,然后再次复制它将失败,因为它缓存所有创建的目录.要解决此问题,您可以在复制之前清除_path_created:

distutils.dir_util._path_created = {}
distutils.dir_util.copy_tree(src, dst)
Run Code Online (Sandbox Code Playgroud)

  • 我遇到了同样的问题,这个解决方法似乎可以“解决”它。但这让代码看起来有点晦涩,所以我会尝试使用另一种复制机制...... (2认同)
  • 未来我在这里。这些都是黑暗时期,但这非常有帮助。发送帮助! (2认同)

out*_*man 5

请阅读有关 distutil 的文档,此模块用于“构建和安装 Python 模块”(https://docs.python.org/2/library/distutils.html

如果要将目录树从一个地方复制到另一个地方,您应该查看shutil.copytree https://docs.python.org/2/library/shutil.html#shutil.copytree


Ian*_*ton 0

看起来很像您被路径分隔符的变化所困扰。主要线索是:

IOError: [Errno 2] No such file or directory: 'D:/test2\\test_file'
Run Code Online (Sandbox Code Playgroud)

它使用 os.sep 将文件名与目录名连接起来。我认为如果可以的话,您应该使用正确的路径分隔符。