-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathkasitellyt.py
73 lines (57 loc) · 2.83 KB
/
kasitellyt.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# -*- coding: utf-8 -*-
import json
import shutil
import logging
# tulosteiden kirjoittamiseen
loki = logging.getLogger( 'celia-uutuudet' )
class Käsitellyt():
"""Luokka, jonka avulla pidetään kirjaa siitä, mitkä kirjat on jo edellisellä luettelon luontikerralla käsitelty
Luokassa on jokaisen luettelon jokaisen kategorian uusimman kirjan id."""
def __init__( self, tiedostoNimi ):
"""Luo perustuen annetun nimiseen tiedostoon, josta tiedot luetaan ja johon ne tallennetaan."""
self.tiedostoNimi = tiedostoNimi
# pidetään kirjaa siitä onko käsitellyihin lisätty mitään
# jos ei ole ei tallennettaessa kirjoiteta tiedostoon
self.lisäyksiä = False
try:
# yritä lukea tiedot JSON muodossa tiedostosta
tiedosto = open( tiedostoNimi, 'r', encoding = 'utf-8' )
# luokan sisällä käsitellään tietoja python sanakirjana
self.vanhat = json.load( tiedosto )
tiedosto.close()
except FileNotFoundError:
# ei tiedostoa lähdetään liikkeelle tyhjällä sanakirjalla
self.vanhat = {}
except json.decoder.JSONDecodeError:
loki.error( 'Käsiteltyjen kirjojen tiedoston lukeminen epäonnistui: ei validi json tiedosto.' )
quit()
def lisää( self, luetteloNimi, kategoria, kirjaId ):
"""Lisää kirjaID liittyen tietyn luettelon tiettyyn kategoriaan."""
self.lisäyksiä = True
luettelo = self.vanhat.get( luetteloNimi )
if luettelo == None:
# annettuun luetteloon ei vielä ole tietoja
luettelo = {}
self.vanhat[luetteloNimi] = luettelo
luettelo[kategoria] = kirjaId
def hae( self, luetteloNimi, kategoria ):
"""Hae kirjaId annetun luettelon annetun kategorian uusimmalle kirjalle viime luettelo kerralta."""
luettelo = self.vanhat.get( luetteloNimi )
if luettelo == None:
return None
return luettelo.get( kategoria )
def tallenna( self ):
"""Tallenna tämän hetkiset tiedot tiedostoon.
Luo myös kopion tiedostosta, josta tämä olio uotiin. Alkuperäinen tiedosto ylikirjoitetaan.
Jos yhtään lisäyksiä ei ole tehty ei tallennusta ja vanhan kopiointia tehdä."""
if not self.lisäyksiä:
return
try:
# tehdään kopio tiedostosta
shutil.copyfile( self.tiedostoNimi, 'edelliset_' +self.tiedostoNimi )
except FileNotFoundError:
# tiedostoa ei ollut
pass
tiedosto = open( self.tiedostoNimi, 'w', encoding = 'utf-8' )
json.dump( self.vanhat, tiedosto, ensure_ascii = False, indent = 4 )
tiedosto.close()