import os, re #for itm in os.listdir('mystery'): crime_separator='*******\nCrime' not_sus_regex = r"[Nn][o\']t[ a-z]*sus" not_sus=re.compile(not_sus_regex, re.IGNORECASE) people=dict() companies=set() # in_to_cm('6\'0"') == 182.88 class Person: def __init__(self, name): n=name.strip().split() if len(n)>2: print(name) self.first=n[0] self.last=n[1] self.memberships=set() self.gender=None self.age=None self.not_sus=None self.addr=None self.interview=None self.height=None self.weight=None self.plate=None self.make=None self.color=None def add_member(self, comp): self.memberships.add(comp) def __repr__(self): out=list() for i in sorted(filter(lambda x: x[0]!='_',dir(self))): if not callable(eval('self.'+i)): out.append(': '.join([i, str(eval('self.'+i))])) return '\n'.join(out) def in_to_cm(inch): return round(int(inch.split('\'')[0])*30.48+int(inch.split('\'')[1][:-1])*2.54,2) def lb_to_kg(lb): return round(int(lb.split()[0])*0.4536,2) wonderful_blacklist={'alice','hatter','rabbit','march mare'} def check_wonders(x): x=x.lower() for alice in wonderful_blacklist: if alice in x: return False return True with open(r'mystery\crimescene') as f: scene=filter(lambda x: check_wonders(x) , f.read().split(crime_separator)) with open(r'mystery\crimescene2','w') as f: t=list(sorted(scene, key=lambda x:(not 'clue' in x.lower(),x)))[:10] t=crime_separator+crime_separator.join(t) print(t.replace('\n\n\n','\n'), file=f) addresses=dict() for streetname in os.listdir(r'mystery\streets'): with open(r'mystery\streets'+'\\'+streetname) as f: street=f.readlines() #ints=list(filter(lambda x: 'SEE INTER' in x, f.readlines())) ints=set() for nr in range(len(street)): if 'SEE INTER' in street[nr]: ints.add((streetname, nr+1, street[nr].strip().split('#')[1])) for inter in ints: intr=inter[2] with open(r'mystery\interviews\interview-'+intr) as inf: inview=inf.read().strip().lower().replace('\n', ' ') ns=bool(not_sus.findall(inview)) # if ns: print(inview) streetname=inter[0].replace('_',' ') addresses[(streetname, str(inter[1]))]={'ns':ns,'interv':inview} for comp in os.listdir(r'mystery\memberships'): with open(r'mystery\memberships'+'\\'+comp) as f: for name in f: name=name.strip() if name not in people: people[name]=Person(name) people[name].add_member(comp) with open(r'mystery\people') as f: for line in f.readlines()[8:]: name, g, age, addr=line.strip().split('\t') name=name.strip() if name not in people: people[name]=Person(name) people[name].age=age.strip() people[name].gender=g.strip() people[name].addr=tuple(addr.split(', line ')) if people[name].addr in addresses: people[name].interview=addresses[people[name].addr]['interv'] people[name].not_sus=addresses[people[name].addr]['ns'] # else:print(people[name].addr, list(addresses)[4]) with open(r'mystery\vehicles') as f: for car in f.read().split('\n\n')[1:]: t=list(map(lambda x:x.replace('se Plate', 'te:').split(': ')[1].strip(), car.strip().split('\n'))) plate, make, color,name, hei, wei=t if name not in people: people[name]=Person(name) people[name].height=in_to_cm(hei) people[name].weight=lb_to_kg(wei) people[name].plate=plate people[name].make=make people[name].color=color def format_output(field): if not field:return '' elif type(field) in {list, tuple}: return ', '.join(list(map(format_output,field))) elif type(field) in {set}: return ', '.join(list(map(format_output,sorted(field)))) elif type(field) is float: return str(field).replace('.',',') else: return str(field).replace('\n', ' ') f=open('people.csv','w') print('Full name;First;Last;G;Height;Age;Weight;Address;Sus;Make;Color;Plate;Membership;Interview', file=f) for name in sorted(people): output_row=[name] pp=people[name] output_row.append(pp.first) output_row.append(pp.last) output_row.append(pp.gender) output_row.append(pp.height) output_row.append(pp.age) output_row.append(pp.weight) output_row.append(pp.addr) output_row.append(pp.not_sus) output_row.append(pp.make) output_row.append(pp.color) output_row.append(pp.plate) output_row.append(pp.memberships) output_row.append(pp.interview) print(*list(map(format_output,output_row)),sep=';', file=f) f.close()