--- a/bussit.py Mon Apr 17 22:56:39 2017 +0300 +++ b/bussit.py Tue Apr 18 14:59:18 2017 +0300 @@ -1,19 +1,10 @@ #!/usr/bin/env python3 -import enum +import enum, json +from sys import stderr from datetime import date, time, datetime, timedelta +from misc import * Suunta = enum.Enum('Suunta', [('Taaksepäin', 0), ('Eteenpäin', 1)]) -def lue_csv(tiedosto, muunnokset = None): - import csv - lukija = csv.reader(tiedosto) - otsakkeet = next(lukija) - for rivi in lukija: - tietue = dict(zip(otsakkeet, rivi)) - if muunnokset: - for avain, muunnos in muunnokset.items(): - tietue[avain] = muunnos(tietue[avain]) - yield tietue - def muunna_ajovuoro_tunniste(tunniste): return int(tunniste.split('_')[0]) @@ -53,8 +44,8 @@ return 'palvelut[%r]' % self.tunniste class Pysäkki: - def __init__(self, tunniste, nimi): - self.tunniste, self.nimi = tunniste, nimi + def __init__(self, tunniste, nimi, sijainti): + self.tunniste, self.nimi, self.sijainti = tunniste, nimi, sijainti def __repr__(self): return 'pysäkit[%r]' % self.tunniste def aikataulu(self, määrä = 50): @@ -122,16 +113,16 @@ palvelut = {} pysäkit = {} -print('Ladataan linjat... ', end = '', flush = True) +print('Ladataan linjat... ', file = stderr, end = '', flush = True) with open('gtfs/routes.txt') as tiedosto: for rivi in lue_csv(tiedosto): linja = Linja(rivi) linja.tunniste = linja.tunniste linjat[linja.viite] = linja linjat_per_tunniste[linja.tunniste] = linja -print('%d linjaa' % len(linjat)) +print('%d linjaa' % len(linjat), file = stderr) -print('Ladataan ajot... ', end = '', flush = True) +print('Ladataan ajot... ', file = stderr, end = '', flush = True) with open('gtfs/trips.txt') as tiedosto: for rivi in lue_csv(tiedosto, muunnokset = {'direction_id': lambda k: Suunta(int(k))}): if rivi['service_id'] not in palvelut: @@ -144,7 +135,7 @@ suunta = rivi['direction_id']) assert ajo.nimi not in ajot ajot[ajo.nimi] = ajo -print('%d ajoa' % len(ajot)) +print('%d ajoa' % len(ajot), file = stderr) def lue_päiväys(teksti): return date(int(teksti[:4]), int(teksti[4:6]), int(teksti[6:])) @@ -153,7 +144,7 @@ tunti, minuutti, sekunti = map(int, teksti.split(':')) return timedelta(hours = tunti, minutes = minuutti, seconds = sekunti) -print('Ladataan päiväykset... ', flush = True) +print('Ladataan päiväykset... ', file = stderr, flush = True) viimeinen_käyttöpäivä = date.today() palvelut_per_päivä = {} @@ -173,14 +164,18 @@ if päivä in palvelu.päivät: yield palvelu -print('Ladataan pysäkit... ', end = '', flush = True) +print('Ladataan pysäkit... ', file = stderr, end = '', flush = True) with open('gtfs/stops.txt') as file: for rivi in lue_csv(file): - pysäkki = Pysäkki(rivi['stop_id'], rivi['stop_name']) + sijainti = (float(rivi['stop_lat']), float(rivi['stop_lon'])) + pysäkki = Pysäkki(rivi['stop_id'], rivi['stop_name'], sijainti) pysäkit[pysäkki.tunniste] = pysäkki -print('%d pysäkkiä' % len(pysäkit)) +with open('pysäkkialueet.json') as file: + for pysäkkitunniste, alue in json.load(file).items(): + pysäkit[pysäkkitunniste].alue = alue +print('%d pysäkkiä' % len(pysäkit), file = stderr) -print('Ladataan aikataulut... ', end = '', flush = True) +print('Ladataan aikataulut... ', end = '', flush = True, file = stderr) with open('gtfs/stop_times.txt') as file: rivimäärä = sum(line.count('\n') for line in file) laskettu = 0 @@ -193,5 +188,5 @@ ajo.reitti.append(Pysähdys(saapumisaika, lähtöaika, pysäkki, ajo)) laskettu += 1 if laskettu % 1000 == 0: - print('\rLadataan aikataulut... %.1f%%' % (laskettu * 100 / rivimäärä), end = ' ') -print('\rLadataan aikataulut... ladattu') \ No newline at end of file + print('\rLadataan aikataulut... %.1f%%' % (laskettu * 100 / rivimäärä), end = ' ', file = stderr) +print('\rLadataan aikataulut... ladattu', file = stderr) \ No newline at end of file