How about this (second class version)?
from itertools import takewhile class Foo: def __init__(self, K = None): self.bf=open('b', 'w') self.cf=open('c', 'w') self.count = 0 self.K = K def Go(self): for self.line in takewhile(self.Lamda(), open('a')): self.SplitLine() if self.IsValidPid(): self.WriteLineToFiles() def SplitLine(self): self.lineSplit=self.line.split(',') def Lamda(self): if self.K is None: return lambda x: x.split(',')[0] != '[Controls]' else: return lambda x: x.split(',')[0] != '[Controls]' and self.count < self.K def IsValidPid(self): pid=self.lineSplit[1][0:3] return pid!='cnv' and pid!='hCV' and pid!='cnv' def WriteLineToFiles(self): self.count += 1 self.bf.write(self.ParseLine()) if self.K is None: self.cf.write(self.line) def ParseLine(self): return (self.lineSplit[1] + ',' + self.lineSplit[2] + ',' + self.lineSplit[3][1] + self.lineSplit[3][3] + ',' + self.lineSplit[15] + ',' + self.lineSplit[9] + ',' + self.lineSplit[10]).strip('"')+'\n' Foo().Go()
Original version:
from itertools import takewhile if K is None: illuminacond = lambda x: x.split(',')[0] != '[Controls]' else: illuminacond = lambda x: x.split(',')[0] != '[Controls]' and i < K def Parse(line): return (line[1] + ',' + line[2] + ',' + line[3][1] + line[3][3] + ',' + line[15] + ',' + line[9] + ',' + line[10]).strip('"')+'\n' def IsValidPid(line_split): pid=line_split[1][0:3] return pid!='cnv' and pid!='hCV' and pid!='cnv' bf=open('b', 'w') cf=open('c', 'w') def WriteLineToFiles(line, line_split): bf.write(Parse(line_split)) if K is None: cf.write(line) i = 0 for line in takewhile(illuminacond, open('a')): line_split=line.split(',') if IsValidPid(line_split): WriteLineToFiles(line, line_split) i += 1
source share