import os import re 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() wonderful_blacklist = {'alice', 'hatter', 'rabbit', 'march mare'} # 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) def check_wonders(x): x = x.lower() for alice in wonderful_blacklist: if alice in x: return False return True 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', ' ') 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 = 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'] 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 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()