2016-08-15 11 views
0

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

blablabla_350.dat 
blablabla_351.dat 
blablabla_352.dat 
blablabla_353.dat 
... 
blablabla_100.dat 
blablabla_101.dat 
blablabla_102.dat 

Те, заканчивающиеся от 350 до 353 мои образцы, те, оканчивающиеся на 100, 101 и 102 являются ссылки. Хорошо, что образцы и ссылки являются целями в числах.

Я хотел бы разделить их в двух разных списках, образцах и ссылках.

Одна идея должна быть чем-то вроде (пока не работает):

import glob 

samples = [] 
references = [] 

ref = raw_input("Enter first reference name: ") 
num_refs = raw_input("How many references are? ") 

ref = sorted(glob.glob(ref+num_refs)) 

samples = sorted(glob.glob(*.dat)) not in references 

Поэтому ссылка список займет первое имя, указанное и subsequents (данные по количеству указанного). Все остальное будут образцами. Любые идеи, как поместить это в python?

ответ

2

Вы можете использовать glob.glob, чтобы получить список всех файлов *.dat, а затем отфильтровать список, используя список с условным обозначением. В моем решении я использую регулярное выражение для извлечения числа из имени файла в виде текста. Затем я преобразую его в целое число и проверяю, находится ли это целое число между ref_from и ref_to. Это работает, даже если некоторые ссылочные файлы, пронумерованные между ref_from и ref_to, отсутствуют.

Список образцов получен с помощью заданной операции: это результат удаления набора references из набора data_files. Мы можем это сделать, поскольку все имена файлов можно считать уникальными.

import glob 
import re 

samples = [] 
references = [] 

ref_from = 350 
ref_to = 353 

def ref_filter(filename): 
    return ref_from <= int(re.search('_([0-9]+).dat', filename).group(1)) <= ref_to 

data_files = sorted(glob.glob("*.dat")) 
references = [filename for filename in data_files if ref_filter(filename)] 
samples = list(set(data_files) - set(references)) 

print references 
print samples 

В качестве альтернативы, если вы знаете, все образцы между ref_from и ref_to будут присутствовать, вы можете избавиться от функции ref_filter и заменить

references = [filename for filename in data_files if ref_filter(filename)] 

с

references = ['blablabla_' + str(n) + '.dat' for n in xrange(ref_from, ref_to + 1)] 
+0

Большое спасибо @nwk , Не могли бы вы немного объяснить оператор возврата? –

+0

Добро пожаловать! Оператор возвращает 'True' или' False' в зависимости от того, будет ли номер извлечен из имени файла (т. Е. 'N' в' blablabla_N.dat'; см. первый абзац) лежит между 'ref_from' и' ref_to'. – nwk

+0

Отличный трюк! Я не знал, что это можно сделать: D –

2

You может использовать glob.glob('*.dat'), чтобы получить список всех файлов, а затем разрезать этот список в соответствии с вашими критериями. Слайд начнется с индекса первого имени ссылки и будет таким же большим, как количество ссылок.

Извлеките этот кусочек, чтобы получить ваши рекомендации. Удалите этот фрагмент, чтобы получить ваши образцы.

import glob 

samples = [] 
references = [] 

ref = raw_input("Enter first reference name: ")  # blablabla_100.dat 
num_refs = int(raw_input("How many references are? ")) # 3 

all_files = sorted(glob.glob('*.dat')) 
first_ref = all_files.index(ref) 
ref_files = all_files[first_ref:first_ref+num_refs] 

sample_files = all_files 
del sample_files[first_ref:first_ref+num_refs] 
del all_files 

print ref_files, sample_files 

Результат:

['blablabla_100.dat', 'blablabla_101.dat', 'blablabla_102.dat'] ['blablabla_350.dat', 'blablabla_351.dat', 'blablabla_352.dat', 'blablabla_353.dat'] 
+0

Спасибо @ Robᵩ! Хорошее решение! –

-1

попробовать что-то вроде

import glob 

samples = [] 
references = [] 

ref = raw_input("Enter first reference name: ") 
num_refs = int(raw_input("How many references are? ")) 

for number in num_refs: 
    refferences.append(ref+number) 

for filename in sorted(glob.glob('*.dat')): 
    if filename not in refferences: 
     samples.append(filename) 
+0

Поскольку 'num_refs' является' str', что делает 'для числа в num_refs:' do? –

+0

Вот почему я говорю «попробуй что-нибудь вроде» - этот код не на 100% закончен. Однако я добавил функцию «int()», спасибо. –

0

Вы также можете сделать это без glob с помощью os пакета:

import os, re 

files = os.listdir(r'C:\path\to\files') 
samples, references = [], [] 
for file in files: 
    if re.search(r'blablabla_1\d{2}', file): 
     references.append(file) 
    elif re.serach(r'blablabla_3\d{2}', file): 
     samples.append(file) 
    else: 
     print('{0} is neither sample nor reference'.format(file)) 
+0

Не забудьте использовать 'r''' или дополнительную обратную косую черту, чтобы избежать вашего' \ d '' в регулярном выражении. –

+0

@Rob Упс, отредактирован. –