awk-like usage of Python
Tom Culliton
culliton at clark.net
Sun Apr 9 12:55:34 EDT 2000
In article <8cq5os$8b9$1 at nnrp1.deja.com>, <ejbaker_seekonk at my-deja.com> wrote:
>I'm a relative newbie to Python. But, I have extensive experience with
>awk (it's an old stand-by that I rely on over and over).
>
>Are there any library modules that make python behave more like awk?
>Lacking that, what's the best way to achieve line by line parsing
>and pattern matching with Python?
Here's an awk like base class written when I first started using
Python. It still sees heavy use today as the base class for many
filters which summarize data from log files. I've seen other more
elaborate ones but this has continued to be useful for me and others.
--------------------------------filter.py--------------------------------
import sys
import os
def perror(*elist) :
for e in elist :
sys.stderr.write(str(e) + " ")
sys.stderr.write("\n")
class file_filter :
def __init__(self, filenames) :
self.filenames = filenames
self.filename = "stdin"
self.file = sys.stdin
self.line = ""
self.nr = 0
self.fnr = 0
def run(self) :
self.nr = 0
self.fnr = 0
self.begin()
if not self.filenames :
self.filename = "stdin"
self.file = sys.stdin
self.do_file()
else :
for self.filename in self.filenames :
self.fnr = 0
try :
ext = os.path.splitext(self.filename)[1]
if ext == ".Z":
self.file = os.popen("zcat " + self.filename, "rb")
elif ext == ".gz":
self.file = os.popen("gzip -dc " + self.filename, "rb")
elif ext == ".bz2":
self.file = os.popen("bzip2 -dc " + self.filename, "rb")
else:
self.file = open(self.filename, "rb")
except IOError, msg :
perror("Cannot open:", self.filename, msg)
continue
self.do_file()
self.file.close()
self.end()
def do_file(self) :
while 1 :
self.line = self.file.readline()
if self.line == "" : break
self.nr = self.nr + 1
self.fnr = self.fnr + 1
self.do_line()
def do_line(self) :
print self.line,
def begin(self) :
pass
def end(self) :
pass
More information about the Python-list
mailing list