2009-04-15 15 views
1

Comment est-ce que j'écrirais une fonction dans Python pour déterminer si une liste de noms de fichiers correspond à un modèle donné et quels fichiers sont manquants de ce modèle? Par exemple:trouver manquant numérique de ALPHANUMERIC - Python

Entrée ->

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 

souhaité Sortie ->

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

Entrée ->

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

souhaité Sortie ->

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

S'il vous plaît reformuler cette question. Ce n'est pas du tout clair ce que vous demandez. – kquinn

+0

Les fichiers sont-ils en ordre? les fichiers correspondent-ils toujours au modèle donné? KUMAR. ##. Txt? – dustyburwell

Répondre

1

En supposant que les motifs sont relativement statiques, cela est assez facile avec une expression régulière:

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

Vous pouvez aborder cela comme:

  1. Convertir les noms de fichiers entiers appropriés.
  2. Trouvez les numéros manquants.
  3. Combinez les numéros manquants avec le modèle de nom de fichier en sortie.

Pour (1), si la structure du fichier est prévisible, alors c'est facile.

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

Vu:

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'] 

vous pouvez obtenir une liste des numéros connus par: map(to_num, lst). Bien sûr, pour trouver des lacunes, vous n'avez vraiment besoin que du minimum et du maximum. Combinez cela avec la fonction range et vous obtenez tous les numéros que vous devriez voir, puis supprimez les numéros que vous avez. Les ensembles sont utiles ici.

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

Mettre le tout ensemble:

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