Shutil.copy IO Error2 当目录存在时

Shutil.copy IO Error2 when directory exists

我的代码遇到了一个棘手的问题,我一直无法解决。基本上我是将文件从我计算机上的本地目录复制到 Dropbox 文件夹,该文件夹充当我和其他一些人的项目存储库。

我在执行 shutil.copy 行时一直遇到 IO 错误。 Errno 2,没有这样的文件或目录。但是目录和文件都存在。当我将目录更改为 different/test 位置(在我的代码中为 test_dir)时,代码运行得非常好。任何见解将不胜感激。

import os, os.path
import re
import shutil
import sys

#File Location
directory_list = "path where files are located"

#Dropbox base directory: 
dropbox = "path to dropbox directory"

test_dir = "path to test directory on my local machine"    

sed_files = os.listdir(directory_list)

for i in sed_files:
    #print i.split("BBB")[0]

    #df
    copy_dir = re.sub(r'XXX',r'_',i.split("BBB")[0])
    copy_dir = re.sub(r'ZZZ',r'/',copy_dir)
    copy_dir = dropbox + copy_dir + "/FIXED/"   
    if not os.path.exists(copy_dir):
        os.makedirs(copy_dir)       

    shutil.copy(directory_list+i,copy_dir)
    #print directory_list+i
    #os.rename(copy_dir+i,copy_dir+i.split("BBB")[1])

回溯错误是:

Traceback (most recent call last):
File "copy_SE_files.py", line 25, in <module> shutil.copy(direcotry_list+i,copydir)
File "C:\Python27\ArcGIS10.1\lib\shutil.py", line 116, in copy copyfile(src,dst)
File "C:\Python27\ArcGIS10.1\lib\shutil.py", line 82, in copyfile with open(dst, 'wb') as fdst:
IOError: [Errno 2] No such file or directory: 'C:/Users/myusername/Dropbox/NASA_HyspIRI_Project/Field_Data/Spectra/CVARS/April2014/LemonTrees/04172014_SE_LemonTreeCanopy/SE_Files/SpectraZZZCVARSZZZApril2014ZZZLemonTreesZZZZ04172014XXXSEXXXLemonTreeCanopyZZZSEXXXFilesBBBCVARS_na_LemonTrees_Bareground1_4deg_Refl_00355.sed'

感谢堆栈溢出的敏锐眼光,问题解决了。将行修改为:

shutil.copy(directory_list+i,'\\?\'+os.path.abspath(copy_dir))

首先映入我眼帘的是这一行:

shutil.copy(directory_list+i,copy_dir)

考虑将其更改为

shutil.copy(os.path.join(directory_list,i),copy_dir)

IOW,在连接文件路径时使用 os.path.join()

您失败了,因为路径的总长度大于 Window 的 MAX_PATH 限制。 C:/Users/myusername/Dropbox/NASA_HyspIRI_Project/Field_Data/Spectra/CVARS/April2014/LemonTrees/04172014_SE_LemonTreeCanopy/SE_Files/SpectraZZZCVARSZZZApril2014ZZZLemonTreesZZZZ04172014XXXSEXXXLemonTreeCanopyZZZSEXXXFilesBBBCVARS_na_LemonTrees_Bareground1_4deg_Refl_00355.sed 的长度为 274 个字符,而且大多数 Windows 文件操作 API 都无法在长于 MAX_PATH 的路径(即 260,其中之一为 NUL 终止符保留)。

假设 Python 使用正确的 API,您可以使其与 the extended path prefix\?\ 一起使用(并且它可能要求您在路径中使用反斜杠而不是正斜杠;我不清楚;请阅读文档)。

一个解决方法是:

try:
    shutil.copy(src, dest)
except:
   try:
       shutil.copy(src, "\\?\" + dest)
       #If Long Path as per Maximum Path limitation Windows
   except:
       self.failed_TC=True
       print("Failed to move the script "+os.path.basename(src)+" to "+dest)