2012-02-13 63 views
1

我有一個大型圖像數據集(大約3000個文件)。我的問題很簡單,我想將隨機選擇的圖像文件複製到另一個目的地。我使用random.sample來選擇五百個圖像並將其名稱存儲在列表中。 我現在想要將文件從src文件夾複製到目標文件夾,如果它們的名字存在於列表中(並且因此被隨機選擇)。shutil和複製文件

但是,下面的代碼複製文件夾中的所有文件,不管它們的名稱是否出現在隨機選擇的列表中。幫助

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 

回答

3

在這種情況下,您使用glob.glob是發生危險的地方。這將返回適合您提供的模式的所有文件的迭代器。您正在建立500個特定文件的列表,但之後按照模式進行匹配...取決於文件名中的字符,這可能會給您帶來非常令人驚訝的結果,因爲該模式可能會比您的原始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) 
+0

謝謝....一定會試試這個。 – 2012-02-13 18:05:17

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) 
+0

謝謝...我由衷地感激!我應該提到我是python的新手,但我每天都在成長。 – 2012-02-13 18:10:45