ChannelReader.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. # from . import DataHandler #此时是导入文件
  2. from .DataStream import DataReadStream, day_stamp, open_hdf5
  3. from .DataStream import EChPosmap as pos_map
  4. import numpy as np
  5. import re
  6. from collections import defaultdict
  7. import time as time
  8. __all__ = ['ChannelReader']
  9. import logging
  10. logger = logging.getLogger('reader')
  11. class ChannelReader(DataReadStream):
  12. def __init__(self):
  13. file = '/var/www/html/data/stdata/channel.hdf5'
  14. hfive = open_hdf5(file, False)
  15. super(ChannelReader, self).__init__(hfive)
  16. def __del__(self):
  17. self.close()
  18. super(ChannelReader, self).__del__()
  19. pass
  20. def tuple_path(self, day: int, chnames: set = None, card_types: set = None, spec: int = None):
  21. def parse(path):
  22. items = re.split(r'/', path)
  23. (_prifix, _version, today, chnam, card_type, spec) = items
  24. return chnam, int(card_type), int(spec)
  25. tuples = defaultdict(list)
  26. pathes = self.datasets(day)
  27. for path in pathes:
  28. _chnam, _card_type, _spec = parse(path)
  29. tuples[_chnam].append((_card_type, _spec))
  30. def name_filter(tuples, chnames):
  31. all = True if chnames is None or len(chnames) == 0 else False
  32. if all:
  33. return tuples
  34. else:
  35. result = defaultdict(list)
  36. for chame, tup in tuples.items():
  37. if chame in chnames:
  38. result[chame] = tup
  39. return result
  40. tuples = name_filter(tuples, chnames)
  41. def typespec_filter(tuples, card_types, spec):
  42. result = defaultdict(list)
  43. for name, ls in tuples.items():
  44. for tup in ls:
  45. _card_type, _spec = tup
  46. if _card_type in card_types:
  47. if spec is None or _spec == spec:
  48. result[name].append((_card_type, _spec))
  49. return result
  50. tuples = typespec_filter(tuples,card_types,spec)
  51. return tuples
  52. def many_tuple_path(self, days: list, chnames: set = None, card_types: set = None, spec: int = None):
  53. def merge(l,r):
  54. for name,ls in l.items():
  55. if name in r:
  56. ls.extend(r[name])
  57. r[name] = list(set(ls))
  58. else:
  59. r[name] = ls
  60. return r
  61. # stime = lambda t: time.strftime('%d-%H:%M:%S', time.localtime(t))
  62. all = defaultdict(set)
  63. for day in days:
  64. # logger.debug("day = %s", stime(day))
  65. tuples = self.tuple_path(day, chnames, card_types, spec)
  66. all = merge(tuples,all)
  67. # logger.debug('tuples')
  68. # logger.debug(tuples)
  69. # logger.debug('all')
  70. # logger.debug(all)
  71. return all
  72. def init_data(self, days):
  73. dim = pos_map.dim()
  74. return np.zeros((dim, 86400 * days))
  75. def read(self, day_stamp, chname, card_type, spec):
  76. path = f'/{self._version}/{day_stamp}/{chname}/{card_type}/{spec}'
  77. hfive = self.file
  78. if path in hfive:
  79. return hfive[path]
  80. else:
  81. return None
  82. pass