Hi, thanks for the help. Then I got running the following code;

#!/usr/bin/env python

import os, sys, re, string, array, linecache, math

nlach = 12532

lach_list = sys.argv[1]
lach_list_file = open(lach_list,"r")
lach_mol2 = sys.argv[2] # name of the lachand mol2 file
lach_mol2_file = open(lach_mol2,"r")
n_lach_read=int(sys.argv[3])

# Do the following for the total number of lachands

# 1. read the list with the ranked lachands
for i in range(1,n_lach_read+1):
        line = lach_list_file.readline()
        ll = string.split (line)
        #print i, ll[0]
        lach = int(ll[0])
        # 2. for each lachand, print mol2 file
        # 2a. find lachand header in lachand mol2 file (example; kanaka)
        #     and return line number
        line_nr = 0
        for line in lach_mol2_file:
                line_nr += 1
                has_match = line.find('kanaka')
                if has_match >= 0:
                        print 'Found in line %d' % (line_nr)
                        # 2b. print on screen all the info for this lachand
                        #   (but first need to read natoms and nbonds info)
                        #    go to line line_nr + 1
                        ltr=linecache.getline(lach_mol2, line_nr + 1)
                        ll=ltr.split()
                        #print ll[0],ll[1]
                        nat=int(ll[0])
                        nb=int(ll[1])
                        # total lines to print:
                        #   header, 8
                        #   at, na
                        #   b header, 1
                        #   n
                        #   lastheaders, 2
                        #   so; nat + nb + 11
                        ntotal_lines = nat + nb + 11
                        # now we go to the beginning of the lachand
                        # and print ntotal_lines
                        for j in range(0,ntotal_lines):
                                print linecache.getline(lach_mol2, line_nr - 1 
+ j )


which almost works. In the last "for j" loop, i expected to obtain an
output like:

sdsdsdsdsdsd
sdsdsfdgdgdgdg
hdfgdgdgdg

but instead of this, i get:

sdsdsdsdsdsd

sdsdsfdgdgdgdg

hdfgdgdgdg

and also the program is very slow. Do you know how could i solve
this ?

thanks

Tim Chase wrote:
> >> I have to search for a string on a big file. Once this string
> >> is found, I would need to get the number of the line in which
> >> the string is located on the file. Do you know how if this is
> >> possible to do in python ?
> >
> > This should be reasonable:
> >
> >>>> for num, line in enumerate(open("/python25/readme.txt")):
> >     if "Guido" in line:
> >             print "Found Guido on line", num
> >             break
> >
> >
> > Found Guido on line 1296
>
> Just a small caveat here:  enumerate() is zero-based, so you may
> actually want add one to the resulting number:
>
>   s = "Guido"
>   for num, line in enumerate(open("file.txt")):
>     if s in line:
>       print "Found %s on line %i" % (s, num + 1)
>       break # optionally stop looking
>
> Or one could use a tool made for the job:
>
>   grep -n Guido file.txt
>
> or if you only want the first match:
>
>   sed -n '/Guido/{=;p;q}' file.txt
>
> -tkc
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to