Python - Novato atascado con un bucle FOR que solo hace una iteracion

 
Vista:
sin imagen de perfil

Novato atascado con un bucle FOR que solo hace una iteracion

Publicado por Al (3 intervenciones) el 20/10/2015 09:43:29
Hola a todos,

Soy un novato en programacion y Python que se ha encontrado con un problema que quiza sea una tonteria, pero que me esta dejando KO...

He hecho un script que toma dos archivos de input, que son:

a) una lista de identificadores
b) un archivo con varios campos por linea y separados por tabs.

La intencion es coger cada uno de los identificadores de la lista, y buscarlos en su linea correspondiente del archivo tabulado para extraer de esa linea unos valores de interes.

Para lograrlo:

1)He creado una funcion que he colocado dentro de un bucle FOR que recorre la lista de identificadores.

2)Por cada identificador de la lista recibe el archivo tabulado y dicho identificador para hacer la tarea mencionada anteriormente (busqueda de datos del id en el archivo tab).

Aqui va el codigo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/usr/bin/python  
# -*- coding: utf-8 -*-  
import sys, os, re
#Usage:gtf_parser_4.py [path_to_dir] [IDlist]
 
#######FUNCTIONS######################################
 
def findgtf(id, gtf):
 
    id=id.strip()#hay que quitarle espacios y \n
    print "Received Id: *"+id+"* post-stripped"
 
    for line in gtf:
        seq, source, feat, start, end, score, strand, frame, attribute = line.strip().split("\t")
        sc = re.search(str(id), str(attribute))
        print "Received Id: *"+id+"* en FOR pre-busqueda"
 
        if sc:
            print "Coord of "+id+" -> Start: "+str(start)+" End: "+str(end)
 
###########################MAIN#########################
#Captrura de argumentos
mydir = sys.argv[1]
#print"Directory : "+mydir
IDlist = sys.argv[2]
#print"IDlist : "+IDlist
path2ID = os.path.join(mydir, IDlist)
#print"Full IdList: "+path2ID
#creo lista con los identificadores
IDlines = [line.rstrip('\n') for line in open(path2ID)]
 
#Abrir y Leer directorio
for file in os.listdir(mydir):
    if file.endswith(".gtf"):
 
        path2file = os.path.join(mydir, file)
        #print"Full gtf : "+path2file
        gtf = open(path2file,"r")
 
        for id in IDlines:
            print"ID submitted to findgtf: "+id
            fg = findgtf(id, gtf)
        gtf.close()

El problema es que coge el primer identificador de la lista y hace todo el proceso, pero con el segundo y el tercero no llega a hacerlo , por algun motivo, aunque la funcion recibe el identificador, no lo utiliza para la expresion regular de la linea 15 y por tanto no da el resultado que se busca tras llegar a la linea 18....

¿Podriais ayudarme?

Gracias por adelantado

;)
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Novato atascado con un bucle FOR que solo hace una iteracion

Publicado por Al (3 intervenciones) el 20/10/2015 12:24:06
Hola de nuevo,

Segun me han explicado, la solucion esta relacionada con otra cosa diferente de la que yo suponia. Al parecer hay que reiniciar el objeto que contiene el archivo donde se realiza la busqueda de los parametros, ya que tras leerse la primera vez, llega al final y se queda ahi, requiriendo su reinicio para volver a estar disponible en las siguientes rondas con los demas identificadores.

Codigo corregido (ver linea 83):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#!/usr/bin/python  
 
# -*- coding: utf-8 -*-  
 
import sys, os, re
 
#Usage:gtf_parser_4.py [path_to_dir] [IDlist]
 
 
 
#######FUNCTIONS######################################
 
 
 
def findgtf(id, gtf):
 
 
 
    id=id.strip()#hay que quitarle espacios y \n
 
    print "Received Id: *"+id+"* post-stripped"
 
 
 
    for line in gtf:
 
        seq, source, feat, start, end, score, strand, frame, attribute = line.strip().split("\t")
 
        sc = re.search(str(id), str(attribute))
 
        print "Received Id: *"+id+"* en FOR pre-busqueda"
 
 
 
        if sc:
 
            print "Coord of "+id+" -> Start: "+str(start)+" End: "+str(end)
 
 
 
###########################MAIN#########################
 
#Captrura de argumentos
 
mydir = sys.argv[1]
 
#print"Directory : "+mydir
 
IDlist = sys.argv[2]
 
#print"IDlist : "+IDlist
 
path2ID = os.path.join(mydir, IDlist)
 
#print"Full IdList: "+path2ID
 
#creo lista con los identificadores
 
IDlines = [line.rstrip('\n') for line in open(path2ID)]
 
 
 
#Abrir y Leer directorio
 
for file in os.listdir(mydir):
 
    if file.endswith(".gtf"):
 
 
 
        path2file = os.path.join(mydir, file)
 
        #print"Full gtf : "+path2file
 
        gtf = open(path2file,"r")
 
 
 
        for id in IDlines:
 
            print"ID submitted to findgtf: "+id
 
            gtf.seek(0)      #reiniciar el archivo
 
            fg = findgtf(id, gtf)
 
        gtf.close()
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar