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)
我的代码遇到了一个棘手的问题,我一直无法解决。基本上我是将文件从我计算机上的本地目录复制到 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)