你好我想将多个文件夹从一些文件夹列表移动或复制到其他文件夹列表我使用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)
但是无法工作,任何想法如何使我的代码工作?
答案 0 :(得分:1)
首先,显然您使用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 / path contains. That is, you must guarantee that 'C:/my/store/path
必须仅包含目录而不包含文件,因此glob
将仅返回要在shutil.move
中使用的目录。如果用户以后将文件而不是文件夹添加到C:/ my / store / path,那恰好以“代码”结尾,并且他们没有指定任何扩展名(例如,codes.txt,codes.py ...)那么您将在glob
的{{1}}返回列表中找到此文件。当然,保证目录只包含子目录是有问题的,不是一个好主意,根本不是。您可以通过paths2
请注意,您在os.path.isdir
的帮助下使用lambda
过滤掉第一次调用filter
时不包含10
的字符串,你可以用filter
本身实现的东西:
glob
现在,在glob.glob('C:/my/store/path/*10*')
函数的返回列表中将收集名称中包含10的C:/ my / store / path的任何文件或子目录。
第三,glob
截断到其参数列表中最短的可迭代。换句话说,如果您想将zip
中的每个路径移至paths
中的每个路径,则需要paths2
len(paths) == len(paths2)
中的每个文件或目录都有paths
移到directory
。
第四,您错过了paths2
循环的分号以及for
使用shutil.move
代替i
的号码。 Python是一种区分大小写的语言,I
大写与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
只包含C:/ my / store / path目录的子目录,这是一种更好的编写代码的方法,但绝对不是最好的:
paths2
*我上面提到的一些以前的问题仍适用于此代码。
现在你完成了阅读这个答案的漫长马拉松,你想做些什么来改进你的代码?如果你仍然发现一些含糊不清的东西,我会很乐意提供帮助。
祝你好运:)