2009-04-15 4 views
1

Как написать функцию в Python, чтобы определить, соответствует ли список имен файлов заданному шаблону и какие файлы отсутствуют в этом шаблоне? Например:find missing numeric from ALPHANUMERIC - Python

вход ->

KUMAR.3.txt 
KUMAR.4.txt 
KUMAR.6.txt 
KUMAR.7.txt 
KUMAR.9.txt 
KUMAR.10.txt 
KUMAR.11.txt 
KUMAR.13.txt 
KUMAR.15.txt 
KUMAR.16.txt 

Желаемая Выход ->

KUMAR.5.txt 
KUMAR.8.txt 
KUMAR.12.txt 
KUMAR.14.txt 

вход ->

KUMAR3.txt 
KUMAR4.txt 
KUMAR6.txt 
KUMAR7.txt 
KUMAR9.txt 
KUMAR10.txt 
KUMAR11.txt 
KUMAR13.txt 
KUMAR15.txt 
KUMAR16.txt 

Желаемая Выход ->

KUMAR5.txt 
KUMAR8.txt 
KUMAR12.txt 
KUMAR14.txt 
+0

Пожалуйста, перефразировать этот вопрос. Не совсем понятно, о чем вы просите. – kquinn

+0

Являются ли файлы в порядке? все файлы всегда соответствуют заданному шаблону? Кумар. ##. TXT? – dustyburwell

ответ

1

Предполагая, что шаблоны являются относительно статичными, это достаточно легко с регулярным выражением:

import re 

inlist = "KUMAR.3.txt KUMAR.4.txt KUMAR.6.txt KUMAR.7.txt KUMAR.9.txt KUMAR.10.txt KUMAR.11.txt KUMAR.13.txt KUMAR.15.txt KUMAR.16.txt".split() 

def get_count(s): 
    return int(re.match('.*\.(\d+)\..*', s).groups()[0]) 

mincount = get_count(inlist[0]) 
maxcount = get_count(inlist[-1]) 
values = set(map(get_count, inlist)) 
for ii in range (mincount, maxcount): 
    if ii not in values: 
     print 'KUMAR.%d.txt' % ii 
2

Вы можете подойти к этому как:

  1. Преобразование имен файлов в соответствующие целые числа.
  2. Найдите недостающие номера.
  3. Объедините недостающие номера с шаблоном имени файла в качестве вывода.

Для (1), если структура файла предсказуема, это легко.

def to_num(s, start=6): 
    return int(s[start:s.index('.txt')]) 

Дано:

lst = ['KUMAR.3.txt', 'KUMAR.4.txt', 'KUMAR.6.txt', 'KUMAR.7.txt', 
     'KUMAR.9.txt', 'KUMAR.10.txt', 'KUMAR.11.txt', 'KUMAR.13.txt', 
     'KUMAR.15.txt', 'KUMAR.16.txt'] 

вы можете получить список известных номеров по: map(to_num, lst). Конечно, чтобы искать пробелы, вам действительно нужен минимум и максимум. Объедините это с функцией range, и вы получите все номера, которые вы должны увидеть, а затем удалите номера, которые у вас есть. Наборы полезны здесь.

def find_gaps(int_list): 
    return sorted(set(range(min(int_list), max(int_list))) - set(int_list)) 

Собираем все вместе:

missing = find_gaps(map(to_num, lst)) 
for i in missing: 
    print 'KUMAR.%d.txt' % i