diff --git a/README.md b/README.md index 5841e1d..944a865 100644 --- a/README.md +++ b/README.md @@ -1 +1,3 @@ Python学习笔记 + +添加了一个职责链DEMO可以用于清洗微博时间(装逼失败)。 diff --git "a/\350\256\276\350\256\241\346\250\241\345\274\217/\345\215\225\344\276\213Demo/hbaseconnection_test.py" "b/\350\256\276\350\256\241\346\250\241\345\274\217/\345\215\225\344\276\213Demo/hbaseconnection_test.py" new file mode 100644 index 0000000..1e34399 --- /dev/null +++ "b/\350\256\276\350\256\241\346\250\241\345\274\217/\345\215\225\344\276\213Demo/hbaseconnection_test.py" @@ -0,0 +1,73 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/31 14:15 +# @Author : 哎哟卧槽 +# @Site : +# @File : hbaseconnection.py +# @Software: PyCharm +import sys +import happybase +from happybase import NoConnectionsAvailable +from datetime import datetime +from common.public import * +import threading +Lock = threading.Lock() + +sys.setrecursionlimit(1500) + + +class HappyBaseConnection(object): + + __instance = None + + # def __init__(self, host='localhost', port=9090, *args, **kwargs): + # self.HB = happybase.Connection(host=host, port=port) + # self.HB.open() + # print('打开连接', self.HB) + + def __new__(cls, host='localhost', port=9090, *args, **kwargs): + if not cls.__instance: + try: + Lock.acquire() + if not cls.__instance: + cls.__instance = super(HappyBaseConnection, cls).__new__(cls, *args, **kwargs) + hb = happybase.Connection(host=host, port=port) + hb.open() + setattr(cls.__instance, 'hb', hb) + print('我只会调用一次') + finally: + Lock.release() + return cls.__instance + + def puts(self, table_name, row_key, mutations, send): + table = self.hb.table(table_name) + try: + with table.batch(transaction=True) as b: + if send: + b.put(row_key, mutations) + b.send() + print('处理任务结束:', datetime.now()) + return True + else: + b.put(row_key, mutations) + except NoConnectionsAvailable as err: + print(err.args) + raise NoConnectionsAvailable + + def get_data(self, table_name, row_key, columns): + print('开始查询数据:', datetime.now()) + table = self.hb.table(table_name) + if not isinstance(columns, list): + raise ValueError ("{}参数必须是list".format(columns)) + columns = [conve_byte(i) for i in columns] + row = table.row(conve_byte(row_key), columns=columns) + return row + + +if __name__ == '__main__': + HB = HappyBaseConnection('10.10.1.246') + HB2 = HappyBaseConnection('10.10.1.246') + print(HB) + print(HB2) + print(HB.get_data('webpages', '00117ee05a64db33ed3ad5bde3c58bfc', ['spider:info'])) + # print(HB.get_data('webpages', '00117ee05a64db33ed3ad5bde3c58bfc')) + print('查询数据结束:', datetime.now()) \ No newline at end of file diff --git "a/\350\256\276\350\256\241\346\250\241\345\274\217/\350\201\214\350\264\243\351\223\276+\345\215\225\344\276\213\346\250\241\345\274\217demo/README" "b/\350\256\276\350\256\241\346\250\241\345\274\217/\350\201\214\350\264\243\351\223\276+\345\215\225\344\276\213\346\250\241\345\274\217demo/README" new file mode 100644 index 0000000..6c8a2f9 --- /dev/null +++ "b/\350\256\276\350\256\241\346\250\241\345\274\217/\350\201\214\350\264\243\351\223\276+\345\215\225\344\276\213\346\250\241\345\274\217demo/README" @@ -0,0 +1 @@ +一个可以用于清洗微博的时间的职责链 \ No newline at end of file diff --git "a/\350\256\276\350\256\241\346\250\241\345\274\217/\350\201\214\350\264\243\351\223\276+\345\215\225\344\276\213\346\250\241\345\274\217demo/timeconversion.py" "b/\350\256\276\350\256\241\346\250\241\345\274\217/\350\201\214\350\264\243\351\223\276+\345\215\225\344\276\213\346\250\241\345\274\217demo/timeconversion.py" new file mode 100644 index 0000000..a4ef206 --- /dev/null +++ "b/\350\256\276\350\256\241\346\250\241\345\274\217/\350\201\214\350\264\243\351\223\276+\345\215\225\344\276\213\346\250\241\345\274\217demo/timeconversion.py" @@ -0,0 +1,185 @@ +# -*- coding: utf-8 -*- +# @Time : 2017/7/27 10:22 +# @Author : 哎哟卧槽 +# @Site : 用作时间格式转换;例如 :3小时之前 3天之前 +# @File : time_conversion.py +# @Software: PyCharm + +import re +from abc import ABCMeta, abstractmethod +from datetime import datetime, timedelta +import threading +Lock = threading.Lock() + + +def re_findall(pattern, string, flags=0): + """ + :param pattern: 正则表达式 + :param string: 需要匹配的字符串 + :param flags: + :return: 与结果相匹配的字符串 + """ + string = re.findall(pattern, string, flags) + return ''.join(string) or '' + + +class Handler(metaclass=ABCMeta): + '''时间转换基类''' + + def __init__(self,): + self.successor = None + + def set_successor(self, successor): + """设置继任者 + :param successor: 继任者 + :return: + """ + self.d = datetime.now() + self.successor = successor + + @abstractmethod + def handler(self, data): return + + +class MinutesBefore(Handler): + """分钟之前""" + _g_name = '_name_minutes_before' + + def handler(self, data): + value = re_findall(r'\s*(\d+)分钟\s*', data) + if value: + d1 = self.d + timedelta(minutes=-int(value)) + return d1.strftime('%Y-%m-%d %H:%M:%S') + return self.successor.handler(data) if self.successor else data + + +class HoursBefore(Handler): + """小时之前""" + _g_name = '_name_hours_before' + + def handler(self, data): + value = re_findall(r'\s*(\d+)小时\s*', data) + if value: + d1 = self.d + timedelta(hours=-int(value)) + return d1.strftime('%Y-%m-%d %H:%M:%S') + return self.successor.handler(data) if self.successor else data + + +class MonthsBefore(Handler): + """月份前""" + _g_name = '_name_months_before' + + def handler(self, data): + value = re_findall(r'\s*(\d{1,2}月\d{1,2}日\s+\d{2}:\d{2})\s*', data) + if value: + d1 = datetime.strptime(value, '%m月%d日 %H:%M') + return str(self.d.year) + '-' + d1.strftime('%m-%d %H:%M:%S') + return self.successor.handler(data) if self.successor else data + + +class YearsBefore(Handler): + """年之前""" + _g_name = '_name_years_before' + + def handler(self, data): + value = re_findall(r'\s*(\d{4}-\d{1,2}-\d{1,2}\s+\d{2}:\d{2}:\d{2})\s*', data) + if value: + return value + return self.successor.handler(data) if self.successor else data + + +class TodayBefore(Handler): + """今天""" + _g_name = '_name_todays_before' + + def handler(self, data): + value = re_findall(r'\s*今天\s*(\d{2}:\d{2})\s*', data) + if value: + d2 = self.d.strftime('%Y-%m-%d') + return d2 + value + return self.successor.handler(data) if self.successor else data + + +class Yesterday(Handler): + '''昨天''' + _g_name = '_name_yesterday' + + def handler(self, data): + value = re_findall(r'昨天\s*(\d{2}:\d{2})\s*', data) + if value: + d1 = datetime.now() + timedelta(days=-1) + return d1.strftime('%Y-%m-%d') + ' ' + value + ':00' + return self.successor.handler(data) if self.successor else data + + +class YesterdayBefore(Handler): + '''前天''' + _g_name = '_name_yesterday_before' + + def handler(self, data): + value = re_findall(r'前天\s*(\d{2}:\d{2})\s*', data) + if value: + d1 = datetime.now() + timedelta(days=-2) + return d1.strftime('%Y-%m-%d') + ' ' + value + ':00' + return self.successor.handler(data) if self.successor else data + + +class SeveralDays(Handler): + '''几天前''' + _g_name = '_name_several_days' + + def handler(self, data): + value = re_findall(r'\s*(\d+)\s*天前', data) + if value: + d1 = datetime.now() + timedelta(days=-int(value)) + return d1.strftime('%Y-%m-%d') + ' 00:00:00' + return self.successor.handler(data) if self.successor else data + + +class TimeConversion(object): + """单例模式 + 防止每次重复创建实例化、节约系统资源 + """ + # 定义静态变量实例 + __instance = None + + def __init__(self, *args, **kwargs): + pass + + def __new__(cls, *args, **kwargs): + """判断需要实例化对象是否存在 存在则直接返回 不存在则新建 + :param args: + :param kwargs: + :return: 清洗职责链的实例化对象 + """ + if not cls.__instance: + try: + Lock.acquire() + if not cls.__instance: + cls.__instance = super(TimeConversion, cls).__new__(cls, *args, **kwargs) + objects = [eval(key)() for key in globals() if hasattr(eval(key), '_g_name')] + # 拿到第一个清洗class + time_cleaner = objects[0] + tmp_cleaner = None + for obj in objects[1:]: + time_cleaner.set_successor(obj) if not tmp_cleaner else tmp_cleaner.set_successor(obj) + tmp_cleaner = obj + setattr(cls.__instance, 'time_cleaner', time_cleaner) + finally: + Lock.release() + return cls.__instance + + def handler(self, data): + return self.time_cleaner.handler(data) + + +def time_conversion_main(data): + TC = TimeConversion() + return TC.handler(data) + +if __name__ == '__main__': + s1 = TimeConversion() + s2 = TimeConversion() + print(s1) + print(s2) + print(s1.handler('13分钟前')) \ No newline at end of file