2013-06-09 10 views
2

У меня есть огромный список файлов (20k). Каждый файл имеет уникальную строку идентификатора в первой строке. Эта первая строка содержит только эту строку идентификатора. Список файлов имеет около n разных идентификаторов, и каждый идентификатор имеет не менее 500 файлов (но количество файлов для каждого идентификатора не равно).Случайный выбор файлов на основе состояния в файле

Мне нужно случайным образом выборку 500 файлов (каждого идентификатора) и скопировать их в другую директорию, так что я в конечном итоге с подмножеством исходного списка и каждый идентификатор представлен в равном количестве файлов

I знаю random.sample() может дать мне случайный список, но это не заботиться о ограничении в первой строке, и shutil.copy() может копировать файлы ...

но как я могу это сделать (эффективно) в питона, повинуясь ограничения идентификатора в первой строке файла?

+2

Похоже, что вы должны сначала сгруппировать их на основе уникального идентификатора, и для каждой группы получить случайный образец. Трудно понять, что вы делаете без примеров того, как вы используете «идентификатор». –

ответ

3

Из того, что вы описали, вам нужно будет прочитать первую строку каждого файла, чтобы организовать их по идентификаторам. Что-то вроде этого, я думаю, сделаю то, что вы ищите:

import os 
import collections 
import random 
import shutil 

def get_identifier(path): 
    with open(path) as fd: 
     return fd.readline().strip()  #assuming you don't want the \n in the identifier 

paths = ['/home/file1', '/home/file2', '/home/file3'] 
destination_dir = '/tmp' 
identifiers = collections.defaultdict(list) 
for path in paths: 
    identifier = get_identifier(path) 
    identifiers[identifier].append(path) 

for identifier, paths in identifiers.items(): 
    sample = random.sample(paths, 500) 
    for path in sample: 
     file_name = os.path.basename(path) 
     destination = os.path.join(destination_dir, file_name) 
     shutil.copy(path, destination) 
+0

Работает как очарование, спасибо. – Tim

 Смежные вопросы

  • Нет связанных вопросов^_^