我有一个大型图像数据集(大约3000个文件)。我的问题很简单,我想将随机选择的图像文件复制到另一个目的地。我使用random.sample
选择500个图像并将其名称存储在列表中。
我现在想要将文件从src文件夹复制到目标文件夹,如果它们的名称存在于列表中(因此随机选择)。
但是,以下代码会复制文件夹中的所有文件,无论其名称是否出现在随机选择的列表中。帮助
import os.path
import os
import glob
import random
import shutil
dirfiles = os.listdir("/media/Data/Leaves/Leaves")
myfiles = []
myfiles.append(random.sample(dirfiles,500))
print myfiles
final_list=myfiles[0]
print final_list
count=0
for elem in final_list:
print elem
count= count+1
print count
src = '/home/mjanja/Desktop/Leaves'
dst = '/home/mjanja/Desktop/Positive Leaves'
for filename in final_list:
for file in glob.glob( os.path.join(src,filename)):
shutil.copy(file,dst)
print "Copied file!!" +infile
答案 0 :(得分:3)
你正在做一些太复杂的事情,比如计算元素和在不同的地方定义目录。
这个怎么样?
import os
import random
import shutil
src = '/home/mjanja/Desktop/Leaves'
dst = '/home/mjanja/Desktop/Positive Leaves'
dirfiles = os.listdir(src)
myfiles = random.sample(dirfiles, 500)
count = len(myfiles)
for filename in myfiles:
shutil.copy(os.path.join(src, filename), dst)
答案 1 :(得分:3)
在这种情况下,您使用glob.glob是发生危险的地方。返回适合您提供的模式的所有文件的迭代器。您正在构建一个包含500个特定文件的列表,但随后按模式进行匹配...根据您的文件名中的字符,这可能会给您带来非常惊人的结果,因为该模式可能非常匹配比原始文件更多的文件。
你也在不必要地做一些步骤,并且可以将它全部包装在一个函数中:
import os
import random
import shutil
def copy_sample(src, dst, size=500):
files = [os.path.join(src, i) for i in random.sample(os.listdir(src), size)]
count = len(files)
for index, afile in enumerate(files):
try:
shutil.copy(afile, dst)
print 'Copied file %s (%d/%d)' % (afile, index + 1, count)
except Exception, msg:
print 'Failed file %s (%d/%d) -- %s' % (afile, index + 1, count, msg)
src = '/home/mjanja/Desktop/Leaves'
dst = '/home/mjanja/Desktop/Positive Leaves'
copy_sample(src, dst)