[BangPypers] BangPypers Digest, Vol 70, Issue 17
Saurabh Hirani
saurabh.hirani at gmail.com
Mon Jun 17 13:05:23 CEST 2013
Sorry for replying to the wrong thread. This previous mail was an answer to
http://python.6.x6.nabble.com/Novice-Question-on-File-seek-and-tell-methods-td5021174.html
On Mon, Jun 17, 2013 at 4:27 PM, Saurabh Hirani <saurabh.hirani at gmail.com>wrote:
> The problem is that when you do "for line in f" you are using Python's
> iterators and they are not rewindable i.e. "for line in f" gives call the
> next() function but there is no way to go back when you use iterators. You
> can solve your problem with the following snippet of code
>
>
> #!/usr/bin/env python
>
> import re
> import sys
>
> # not doing input validation
> # call program as: python prog.py start_keyword stop_keyword file_to_read
> startat = sys.argv[1]
> stopat = sys.argv[2]
> inputfile = sys.argv[3]
>
> re_startat = re.compile(r'^%s$' % (startat))
> re_stopat = re.compile(r'^%s$' % (stopat))
> pattern = re_startat
>
> with open(inputfile) as f:
> line = f.readline()
> inrange = False
> while line:
> match = re.search(pattern, line)
> # if the pattern matches
> if (match):
> # and we are not in range of startat - stopat
> if (not inrange):
> # get in range and change the pattern
> inrange = True
> pattern = re_stopat
> else:
> # we are in the range => stopat pattern matched
> # print line and exit
> print line
> break
> if (inrange):
> # we are in range + stopat pattern not matched
> # keep on printing
> print line
> line = f.readline()
>
> It does look prettier in vim on a black screen though :)
>
> The idea is you are "in range" if you have matched your first keyword and
> till you stay in the range you keep on printing. When you find your next
> keyword, you are "out of the range" and you exit.
>
> Hope that helps.
>
> --
> regards,
> Saurabh.
> http://curiosityhealsthecat.blogspot.in/
>
>
>
> On Mon, Jun 17, 2013 at 3:30 PM, <bangpypers-request at python.org> wrote:
>
>> Send BangPypers mailing list submissions to
>> bangpypers at python.org
>>
>> To subscribe or unsubscribe via the World Wide Web, visit
>> http://mail.python.org/mailman/listinfo/bangpypers
>> or, via email, send a message with subject or body 'help' to
>> bangpypers-request at python.org
>>
>> You can reach the person managing the list at
>> bangpypers-owner at python.org
>>
>> When replying, please edit your Subject line so it is more specific
>> than "Re: Contents of BangPypers digest..."
>>
>>
>> Today's Topics:
>>
>> 1. Re: [Novice] Question on File seek and tell methods (Vishal)
>>
>>
>> ----------------------------------------------------------------------
>>
>> Message: 1
>> Date: Mon, 17 Jun 2013 01:22:23 +0530
>> From: Vishal <vsapre80 at gmail.com>
>> To: Bangalore Python Users Group - India <bangpypers at python.org>
>> Subject: Re: [BangPypers] [Novice] Question on File seek and tell
>> methods
>> Message-ID:
>> <CACPguY-jfVNb85_==Mvih0-Chj1Ws-rA=-
>> dRGbyYKGjwp1JE3g at mail.gmail.com>
>> Content-Type: text/plain; charset=UTF-8
>>
>> Hi,
>>
>> If the file you are talking about is not too big...i mean has less than
>> say
>> 50,000 lines, then the simplest would be to do:
>>
>> with open('fileName') as fin:
>> lines = fin.readlines()
>>
>> printStuff = False
>> for line in lines:
>> if 'start_keyword' in line:
>> printStuff = True
>> print line
>>
>> elif 'stop_keyword' in line:
>> print line
>> break
>>
>> elif printStuff:
>> print line
>>
>> Hope this helps,
>> Vishal Sapre
>>
>>
>>
>> Thanks and best regards,
>> Vishal Sapre
>>
>> ---
>> "Life is 10% how you make it, and 90% how you take it"
>> "????? ?????, ????? ????? (Benefit for most people, Happiness for most
>> people.)"
>> ---
>> Please DONT print this email, unless you really need to. Save Energy &
>> Paper. Save the Earth.
>>
>>
>> On Thu, Jun 13, 2013 at 1:18 AM, davidsnt <davidsnt at gmail.com> wrote:
>>
>> > Group,
>> >
>> > I need a little help in using the file seek and tell methods, I have a
>> file
>> > with n lines, in which I have to find out the line which starts from a
>> > particular keyword and print all the lines until I find next matching
>> > keyword.
>> >
>> > I did a work around using seek and tell, I used regex as well. I opened
>> the
>> > file, read line by line in a for loop, and checked each line for the
>> > keyword used tell() to get the position and the seek() to move my cursor
>> > and tried to print next lines until I get the next matching keyword but
>> I
>> > failed can you help me here.
>> >
>> > Example test file
>> >
>> > test.log
>> >
>> > Bangalore
>> > Hyderabad
>> > Chennai
>> > Mumbai
>> > Tennis
>> > Cricket
>> > Poker
>> > Angry Birds
>> > Cricket
>> > Mumbai
>> > Chennai
>> >
>> >
>> > I want to read and print from Chennai to Angry Birds
>> >
>> > import sys,re
>> >
>> > f = open('test.log', 'r')
>> >
>> > for line in f:
>> > match = re.search('^Chennai', line)
>> > if(match):
>> > f.seek(f.tell(), 0)
>> > <I am missing out the logic from here>
>> >
>> >
>> > Thanks,
>> > David
>> > _______________________________________________
>> > BangPypers mailing list
>> > BangPypers at python.org
>> > http://mail.python.org/mailman/listinfo/bangpypers
>> >
>>
>>
>> ------------------------------
>>
>> Subject: Digest Footer
>>
>> _______________________________________________
>> BangPypers mailing list
>> BangPypers at python.org
>> http://mail.python.org/mailman/listinfo/bangpypers
>>
>>
>> ------------------------------
>>
>> End of BangPypers Digest, Vol 70, Issue 17
>> ******************************************
>>
>
>
>
> --
> Saurabh
>
--
Saurabh
More information about the BangPypers
mailing list