你好,我想将许多文件夹从某个文件夹列表移动或复制到我使用的其他文件夹列表glob
和shutil
用于这项工作的库。
首先我创建一个文件夹列表:
import glob
#paths from source folder
sourcepath='C:/my/store/path/*'
paths = glob.glob(sourcepath)
my_file='10'
selected_path = filter(lambda x: my_file in x, paths)
#paths from destination folder
destpath='C:/my/store/path/*'
paths2 = glob.glob(destpath)
my_file1='20'
selected_path1 = filter(lambda x: my_file1 in x, paths2)
现在我有两个来自路径的列表(selected_path,selected_path1)
现在我想将文件夹从第一个列表(selected_path
)电影或复制到第二个列表(selected_path1
)
最后我尝试使用此代码移动文件夹但没有成功:
import shutil
for I,j in zip(selected_path,selected_path1)
shutil.move(i, j)
但这行不通,任何ide如何让我的代码工作?
首先,显然您的使用lambda
没有用,glob
函数可以执行此过滤。这就是glob
真正的作用,所以你基本上是用更多不必要的函数调用来乱扔你的代码,这在性能方面是相当昂贵的。
看看这个例子,和你的一样:
import glob
# Find all .py files
sourcepath= 'C:/my/store/path/*.py'
paths = glob.glob(sourcepath)
# Find files that end with 'codes'
destpath= 'C:/my/store/path/*codes'
paths2 = glob.glob(destpath)
其次,第二个glob
函数调用可能会也可能不会返回目录列表以将目录/文件移动到。这使您的代码依赖于 C:/my/store/pathcontains. That is, you must guarantee that 'C:/my/store/path
必须仅包含目录而不包含文件的内容,因此glob
将仅返回要在shutil.move
. 如果用户后来将文件而不是文件夹添加到 C:/my/store/path 恰好以名称“codes”结尾,并且他们没有指定任何扩展名(例如,codes.txt、codes.py...),那么你会在返回的glob
in列表中找到这个文件paths2
。当然,保证一个目录只包含子目录是有问题的,不是一个好主意,根本不是。您可以通过以下方式测试目录os.path.isdir
公告东西,你正在使用lambda
的帮助下filter
,以过滤掉任何字符串不包含10
在你的第一次调用filter
,有些东西你可以实现glob
自己:
glob.glob('C:/my/store/path/*10*')
现在,任何名称中包含 10 的 C:/my/store/path 文件或子目录都将被收集在glob
函数的返回列表中。
第三,zip
截断到其参数列表中最短的可迭代对象。换句话说,如果您想将每个路径 in移动paths
到 中的每个路径paths2
,则需要将 中的len(paths) == len(paths2)
每个文件或目录paths
都directory
移动到 中paths2
。
第四,您错过了for
循环的分号,并且在shutil.move
您的调用中使用i
了I
. Python 是一种区分大小写的语言,I
大写与i
小写并不完全相同:
import shutil
for I,j in zip(selected_path,selected_path1) # missing :
shutil.move(i, j) # i not I
更正的代码:
import shutil
for I,j in zip(selected_path,selected_path1) # missing :
shutil.move(I, j) # i not I
据推测,paths2
仅包含 C:/my/store/path 目录的子目录,这是编写代码的更好方法,但绝对不是最好的:
import glob
#paths from source folder
sourcepath='C:/my/store/path/*10*'
paths = glob.glob(sourcepath)
#paths from destination folder
destpath='C:/my/store/path/*20*'
paths2 = glob.glob(destpath)
import shutil
for i,j in zip(paths,paths2):
shutil.move(i, j)
*我上面提到的一些以前的问题仍然适用于这个代码。
现在您已经完成了阅读这个答案的漫长马拉松,您想做什么来改进您的代码?如果您仍然发现一些不明确的地方,我会很乐意提供帮助。
祝你好运 :)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句