first, second, etc line of text file

Scott David Daniels Scott.Daniels at Acm.Org
Thu Apr 23 17:50:06 EDT 2009


Gabriel Genellina wrote:
> En Wed, 25 Jul 2007 19:14:28 -0300, James Stroud <jstroud at mbi.ucla.edu> 
> escribió:
>> Daniel Nogradi wrote:
>>> A very simple question: I currently use a cumbersome-looking way of
>>> getting the first, second, etc. line of a text file:
>> to_get = [0, 3, 7, 11, 13]
>> got = dict((i,s) for (i,s) in enumerate(open(textfile)) if i in to_get)
>> print got[3]
>> This would probably be the best way for really big files and if you know
>> all of the lines you want ahead of time.
> But it still has to read the complete file (altough it does not keep the 
> unwanted lines).
> Combining this with Paul Rubin's suggestion of itertools.islice I think 
> we get the best solution:
> got = dict((i,s) for (i,s) in 
> enumerate(islice(open(textfile),max(to_get)+1)) if i in to_get)

or even faster:
     wanted = set([0, 3, 7, 11, 13])
     with open(textfile) as src:
         got = dict((i, s) for (i, s) in enumerate(islice(src,
                                         min(wanted), max(wanted) + 1))
                    if i in wanted)
Of course that could just as efficiently create a list as a dict.
Note that using a list rather than a set for wanted takes len(wanted)
comparisons on misses, and len(wanted)/2 on hits, but most likely a
single comparison for a dict whether it is a hit or a miss.

--Scott David Daniels
Scott.Daniels at Acm.Org




More information about the Python-list mailing list