def __init__(self, key): """ :param key: 秘钥 """ Assert.is_true(is_not_empty(key), 'AES 秘钥不能为空') self.key = key
def lexer(self, text, ne_list=[], url=None): """ 词法分析 :param url: :param text: :param ne_list: 过滤命名实体类型 :return: """ url = url if url else getattr(self, 'lexer_url', None) url = url.format(access_token=self.token) res = requests.post(url=url, data=json.dumps(obj={'text': text}), headers=ContentType.JSON_UTF8.value) res.encoding = encodes.Unicode.UTF_8.value if res is None or res.status_code != codes.ok: raise MyError(code=codes.failed, msg='百度词法分析请求失败.') lexer_res, errors = LexerRes.LexerResSchema().load( res.json()) # type: LexerRes Assert.is_true(is_empty(errors), errors) if is_not_empty(ne_list): for lexer_item in lexer_res.items[:]: if lexer_item.ne not in ne_list: # 根据实体列表过滤 lexer_res.items.remove(lexer_item) return lexer_res
def __init__(self, api_key=None, secret_key=None, baidu_cloud=None): """ 百度云图像识别 :param str api_key: 应用的API Key :param str secret_key: 应用的Secret Key :param BaiduCloud baidu_cloud: """ self.token = None if is_not_empty(api_key) and is_not_empty(secret_key): baidu_cloud = BaiduCloud(api_key, secret_key) baidu_cloud.init_token() elif is_not_empty(baidu_cloud) and is_not_empty(baidu_cloud.token): pass else: raise MyError('缺失鉴权 Token 参数.') self.token = baidu_cloud.token
def _format_convert(cls, input_file, output_file, output_ac, output_ar, input_ac=None, input_ar=None, input_format=None, input_acodec=None, output_format=None, output_acodec=None): """ 音频文件格式转换 :param input_file: :param output_file: :param output_ac: :param output_ar: :param input_ac: :param input_ar: :param input_format: :param input_acodec: :param output_format: :param output_acodec: :return: """ output_dir, _, _ = FileUtil.get_path_name_ext(output_file, is_strict=False) FileUtil.creat_dirs(output_dir) if cls.is_pcm(input_file): # 格式为 pcm 格式,需要音频文件参数 Assert.is_true((is_not_empty(input_ac) and is_not_empty(input_ar) and is_not_empty(input_format) and is_not_empty(input_acodec)), 'pcm 缺失文件参数') _, error = (ffmpeg.input( input_file, **cls._file_args( input_format, input_acodec, input_ac, input_ar)).output( output_file, **cls._file_args(output_format, output_acodec, output_ac, output_ar)).run(capture_stdout=False, overwrite_output=True))
def _file_args(cls, format=None, acodec=None, ac=None, ar=None): """ 音频文件参数信息 :param str format: 格式 :param str acodec: 编码器 :param int ac: 声道数 :param int ar: 采样率 :return: """ file_dict_args = {} if is_not_empty(format): file_dict_args['format'] = format if is_not_empty(acodec): file_dict_args['acodec'] = acodec if is_not_empty(ac): file_dict_args['ac'] = ac if is_not_empty(ar): file_dict_args['ar'] = ar return file_dict_args
def decorated_function(*args, **kwargs): args_tuple = args[1:] if is_not_empty(args_tuple): return func(*args, **kwargs) try: kwargs_dict = current_app.get_object_dict(key) kwargs_dict.update(kwargs) return func(*args, **kwargs_dict) except RuntimeError: # 未创建 flask 上下文,直接返回原参数 return func(*args, **kwargs)
def __init__(self, app_id=None, api_key=None, secret_key=None, baidu_cloud=None, **kwargs): """ 音频应用 :param app_id: :param api_key: :param secret_key: :param baidu_cloud: """ self.app_id = app_id self.token = None if is_not_empty(api_key) and is_not_empty(secret_key): baidu_cloud = BaiduCloud(api_key, secret_key) baidu_cloud.init_token() elif is_not_empty(baidu_cloud) and is_not_empty(baidu_cloud.token): pass else: raise MyError('缺失鉴权 Token 参数.') self.token = baidu_cloud.token if kwargs: for key, value in kwargs.items(): setattr(self, key, value)
def __init__(self, app_id=None, api_key=None, sign=None, **kwargs): """ 讯飞开放平台数字签名 :param str app_id: 讯飞开放平台应用ID :param str api_key: 讯飞开放平台应用秘钥 :param Sign sign: 讯飞开放平台数字签名对象 """ if is_not_empty(app_id) and is_not_empty(api_key): sign = Sign(app_id, api_key) elif is_not_empty(sign) and is_not_empty(sign.signa): pass else: raise MyError('缺失数字签名参数.') self.app_id = app_id self.ts = sign.ts self.signa = sign.signa self.task_id = None if kwargs: for key, value in kwargs.items(): setattr(self, key, value)
def amount_formatting(s, formats): """ 金额格式化 :param s: :param formats: :return: """ try: if is_not_empty(s): for format in formats: s = s.replace(format, '') return float(s.strip()) return None except: return None
def init_token(self): """ 百度云鉴权接口 :return: :rtype:Token """ res = requests.post(url=self.token_url, headers=ContentType.JSON_UTF8.value) res.encoding = encodes.Unicode.UTF_8.value if res is None or res.status_code != codes.ok: raise MyError( code=codes.server_error, msg='百度云鉴权请求失败【{0}】'. format(res.status_code if res is not None else codes.bad) ) token, _ = Token.TokenSchema().load(res.json()) if is_not_empty(token.error): raise MyError( code=codes.server_error, msg='百度云鉴权失败【{0}】: {1}'.format(token.error, token.error_description) ) self.token = token.access_token return token
def digest(input_str, salt, hash_cls, iterations): """ 对字符串进行散列, 支持md5与sha1算法. :param str input_str: 待散列字符 :param bytes salt: 盐 :param str hash_cls: 算法实例 :param int iterations: 跌算次数 :return: """ from utils.encodes import Unicode _hash_model = 'hashlib' hash_instance = create_instance(_hash_model, hash_cls) if is_not_empty(salt): hash_instance.update(salt) hash_instance.update(bytes(input_str, encoding=Unicode.UTF_8.value)) res = hash_instance.digest() for i in range(1, iterations): res = create_instance(_hash_model, hash_cls, res).digest() return res
def decorated_function(*args, **kwargs): # 根据参数类型实例化序列化实例 cls = schema_cls if isinstance(cls, type): cls = cls(*s, **ks) elif isinstance(cls, basestring): cls = create_instance(module_name, cls, *s, **ks) keys, res = func(*args, **kwargs) if not res: return res # 查询转字典 res_add = Dict(dict(zip(keys, res))) res_dic = res_add.load_nest() # 字典反序列化 entity, errors = cls.load(res_dic, partial=cls.partial_db()) if is_not_empty(errors): raise MyError(msg=errors) return entity
def pdf_to_pic(path, pic_dir, format=FileFormat.JPG.value, loss=True, gamma=True, zoom=210, min_size=1.50, max_size=15.0): """ 从pdf中提取图片 :param path: pdf的路径 :param pic_dir: 图片保存的路径 :param format: 图片格式 :param bool loss: 是否压缩 :param bool gamma: 是否 gamma 矫正 :param int zoom: 保存图片分辨率 :param min_size: 文件大小最小阈值 :param max_size: 文件大小最大阈值 :return: {page_num, success_num, fail_num, msg} """ Assert.is_true(os.path.isfile(path), '文件不存在, path: {0}'.format(path)) page_num, success_num, fail_num = 0, 0, 0 detail_info = {'images': []} pdf = None # 初始化图片压缩 pngquant = PngQuant(min_quality=80, max_quality=100, tmp_file=os.path.join(pic_dir, 'quant.tmp.png')) try: FileUtil.creat_dirs(pic_dir) pdf = fitz.Document(path) page_num = pdf.pageCount for pg in range(page_num): pg_zoom = zoom pm_dict = {'page_code': pg + 1} try: page = pdf[pg] # type: Page trans = fitz.Matrix(pg_zoom / 100.0, pg_zoom / 100.0).preRotate(0) pm = page.getPixmap(matrix=trans, alpha=False) # 获得每一页的流对象 page_path = FileUtil.path_join(pic_dir, '{0}.{1}'.format( (pg + 1), format)) # 图片路径 pm.writeImage(page_path) # 保存图片 file_size = FileUtil.get_file_size(page_path) if file_size <= min_size: # 低于最小阀值 pg_zoom = zoom * 2 trans = fitz.Matrix(pg_zoom / 100.0, pg_zoom / 100.0).preRotate(0) pm = page.getPixmap(matrix=trans, alpha=False) pm.writeImage(page_path) elif file_size >= max_size: # 大于最大阀值 pg_zoom = zoom * 2 / 3 trans = fitz.Matrix(pg_zoom / 100.0, pg_zoom / 100.0).preRotate(0) pm = page.getPixmap(matrix=trans, alpha=False) pm.writeImage(page_path) if gamma: # gamma 矫正 Enhancer().enhance(page_path, False, False, False, False, True) if loss: # 对图片进行近无损压缩 pngquant.quant_image(page_path) pm_dict['img_path'] = page_path success_num = success_num + 1 except Exception as e: page_path = pm_dict.get('img_path', '') if is_not_empty(page_path): pm_dict.pop('img_path') if os.path.isfile(page_path): # 处理失败,删除失败文件 FileUtil.del_file(page_path) pm_dict['error_msg'] = repr(e) if repr(e) else 'pdf转图片失败' fail_num = fail_num + 1 finally: detail_info.get('images').append(pm_dict) except Exception as e1: detail_info['error_msg'] = repr(e1) if repr(e1) else '处理pdf失败' finally: if is_not_empty(pdf): pdf.close() if success_num + fail_num != page_num: fail_num = page_num - success_num return page_num, success_num, fail_num, detail_info