File wellmet/reader.py changed (mode: 100644) (index 5c8f8cc..eba49da) |
... |
... |
import numpy as np |
4 |
4 |
from .samplebox import SampleBox |
from .samplebox import SampleBox |
5 |
5 |
from .f_models import Ingot |
from .f_models import Ingot |
6 |
6 |
|
|
|
7 |
|
|
|
8 |
|
class ExportError(BaseException): |
|
9 |
|
pass |
|
10 |
|
|
|
11 |
|
|
|
12 |
|
class Store(list): |
|
13 |
|
""" |
|
14 |
|
stateful object to keep consistency of using append() |
|
15 |
|
# reader bude pokažde otevirat/zavirat soubor, což není úplně ideální, |
|
16 |
|
# ale zás, |
|
17 |
|
# předpokladá se, že každej vzorek musí být schvalen vědeckou radou |
|
18 |
|
# csv umožňuje dozápis |
|
19 |
|
""" |
|
20 |
|
|
|
21 |
|
#č pro formu. Když už dědíme až od seznamu! |
|
22 |
|
__slots__ = ('filename', 'namedtuple') |
|
23 |
|
|
|
24 |
|
def __new__(cls): |
|
25 |
|
raise Exception("Please, use Store.create() constructor") |
|
26 |
|
|
|
27 |
|
@classmethod |
|
28 |
|
def create(cls, filename, namedtuple): |
|
29 |
|
# piece of black magic |
|
30 |
|
self = super().__new__(cls) |
|
31 |
|
|
|
32 |
|
try: |
|
33 |
|
with open(filename + '.csv', 'r', newline='', encoding='utf-8') as f: |
|
34 |
|
reader = csv.reader(f, quoting=csv.QUOTE_NONNUMERIC) |
|
35 |
|
#č první řadek - jmeno n-tice |
|
36 |
|
first_row = next(reader) |
|
37 |
|
if namedtuple.__name__ != first_row[0]: |
|
38 |
|
raise ExportError("%s of target csv is different from %s passed"%\ |
|
39 |
|
(namedtuple.__name__, first_row[0])) |
|
40 |
|
if namedtuple._fields != tuple(next(reader)): |
|
41 |
|
raise ExportError("Target csv have inconsictent data") |
|
42 |
|
|
|
43 |
|
#č aby pandas nám vytvořil pěkné krasné hlavičky |
|
44 |
|
#č a seznam seznamů sežral, |
|
45 |
|
#č první položka musí být namedtuple. |
|
46 |
|
list.append(self, namedtuple(*next(reader))) |
|
47 |
|
|
|
48 |
|
list.extend(self, reader) |
|
49 |
|
|
|
50 |
|
except FileNotFoundError: |
|
51 |
|
pass |
|
52 |
|
|
|
53 |
|
self.filename = filename |
|
54 |
|
self.namedtuple = namedtuple |
|
55 |
|
|
|
56 |
|
return self |
|
57 |
|
|
|
58 |
|
|
|
59 |
|
def append(self, estimation): |
|
60 |
|
if not isinstance(estimation, self.namedtuple): |
|
61 |
|
raise ExportError("Data are of incorrect type") |
|
62 |
|
with open(self.filename + '.csv', 'a', newline='', encoding='utf-8') as csvfile: |
|
63 |
|
csv_writer = csv.writer(csvfile, quoting=csv.QUOTE_NONNUMERIC) |
|
64 |
|
if csvfile.tell() == 0: |
|
65 |
|
csv_writer.writerow([estimation.__class__.__name__]) |
|
66 |
|
csv_writer.writerow(estimation._fields) |
|
67 |
|
csv_writer.writerow(estimation) |
|
68 |
|
|
|
69 |
|
super().append(estimation) |
|
70 |
|
|
|
71 |
|
|
|
72 |
|
|
7 |
73 |
#č Mám hrozné vzpomínky z ladění csv-čka. |
#č Mám hrozné vzpomínky z ladění csv-čka. |
8 |
74 |
#č Pamatuji si, jak po opakované opravě chyby exportu |
#č Pamatuji si, jak po opakované opravě chyby exportu |
9 |
75 |
#č jsem vztekl a posunul celou tu funkcionalitu do tohoto modulu. |
#č jsem vztekl a posunul celou tu funkcionalitu do tohoto modulu. |