我的代码遇到了一个棘手的问题,我一直无法弄明白。基本上我将文件从我的计算机上的本地目录复制到Dropbox文件夹,该文件夹充当我和其他人的项目存储库。
执行shutil.copy行时,我一直遇到IO错误。 Errno 2,N osuch文件或目录。但是目录和文件都存在。当我将目录更改为其他/测试位置(我的代码中的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))
你失败了,因为路径的总长度大于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,\\?\
(它可能需要你在你的路径中使用反斜杠而不是正斜杠;我不清楚;阅读文档)。
跳出来的第一件事就是这条线:
shutil.copy(directory_list+i,copy_dir)
考虑将其更改为
shutil.copy(os.path.join(directory_list,i),copy_dir)
IOW,在连接文件路径时使用os.path.join()
。
一个解决方法是:
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)