【发布时间】:2023-03-27 06:59:01
【问题描述】:
我有一个大目录,其中包含许多要排序的子目录,我正在尝试将特定文件类型复制到新文件夹,但我想保留原始子目录。
def copyFile(src, dest):
try:
shutil.copy(src,dest)
except shutil.Error as e:
print('Error: %s' % e)
except IOError as e:
print('Error: %s' % s.strerror)
for root, directories, files in os.walk(directory):
for directoryname in directories:
dirpath = os.path.join(root,directoryname)
dir_paths.append(dirpath)
dir_names.append(directoryname)
if not os.listdir(dirpath): #Cheching if directory is empty
print("Empty")
EmptyDirs.append(directoryname) #Add directory name to empty directory list
EmptyDirPath.append(dirpath)
else:
pass
for filename in files:
filepath = os.path.join(root,filename)
file_paths.append(filepath)
file_names.append(filename)
if filename.lower().endswith(".sldasm"):
print(filename.encode('utf8'))
SolidModels.append(filename)
copyFile(filepath,dest)
elif filename.lower().endswith(".sldprt"):
print(filename.encode('utf8'))
SolidModels.append(filename)
copyFile(filepath,dest)
else:
pass
这是我现在使用的代码,但它只是复制文件,没有复制它们原来所在的子目录,因此它们在新文件夹中完全没有组织。
这是使用copytree的新代码,但是现在特定文件不会复制,只有子目录可以。
def copytree(src, dst, symlinks=False, ignore=None):
names = os.listdir(src)
if ignore is not None:
ignored_names = ignore(src, names)
else:
ignored_names = set()
os.makedirs(dst)
errors = []
for name in names:
if name in ignored_names:
continue
srcname = os.path.join(src, name)
dstname = os.path.join(dst, name)
try:
if symlinks and os.path.islink(srcname):
linkto = os.readlink(srcname)
os.symlink(linkto, dstname)
elif os.path.isdir(srcname):
copytree(srcname, dstname, symlinks, ignore)
else:
if src is "*.sldasm":
copy2(srcname, dstname)
elif src is "*.sldprt":
copy2(srcname, dstname)
except (IOError, os.error) as why:
errors.append((srcname, dstname, str(why)))
【问题讨论】:
-
见
shutil.copytreedocs.python.org/2/library/shutil.html特别是copytree示例代码。 -
样品我用过,谢谢!我得到了所有要复制的子目录,但现在我无法将文件复制到它们所属的子目录中。有什么建议吗?我在上面添加了我的更新代码
-
代码中的缩进非常令人困惑,因为它混合了制表符和空格。仅使用空格通常被认为是一种最佳做法,并且大多数编辑器都可以配置为在您键入时自动将制表符转换为空格。
标签: python copy subdirectory shutil os.walk