优化命名,类与模块最好不要重名

This commit is contained in:
2024-09-20 14:32:31 +08:00
parent 7b6e78373c
commit f0c03e763b
9 changed files with 50 additions and 32 deletions

236
util/common_util.py Normal file
View File

@@ -0,0 +1,236 @@
import logging
import os
from datetime import datetime
from flask import jsonify
from opencc import OpenCC
from util import string_util
# 获取yyyy-MM-dd HH:mm:ss格式的当前时间
def get_default_datetime():
return datetime.now().strftime('%Y-%m-%d %H:%M:%S')
def get_ocr_layout(ocr, img_path):
"""
获取ocr识别的结果转为合适的layout形式
:param ocr: ocr模型
:param img_path: 图片本地路径
:return:
"""
def _get_box(old_box):
new_box = [
min(old_box[0][0], old_box[3][0]), # x1
min(old_box[0][1], old_box[1][1]), # y1
max(old_box[1][0], old_box[2][0]), # x2
max(old_box[2][1], old_box[3][1]), # y2
]
return new_box
def _normal_box(box_data):
# Ensure the height and width of bbox are greater than zero
if box_data[3] - box_data[1] < 0 or box_data[2] - box_data[0] < 0:
return False
return True
layout = []
ocr_result = ocr.ocr(img_path, cls=False)
ocr_result = ocr_result[0]
if not ocr_result:
return layout
for segment in ocr_result:
box = segment[0]
box = _get_box(box)
if not _normal_box(box):
continue
text = segment[1][0]
layout.append((box, text))
return layout
def delete_temp_file(temp_files):
"""
删除临时文件,可以批量
:param temp_files: 临时文件路径
"""
if not temp_files:
return
if isinstance(temp_files, str):
temp_files = [temp_files]
for file in temp_files:
try:
os.remove(file)
logging.info(f"临时文件 {file} 已删除")
except Exception as e:
logging.warning(f"删除临时文件 {file} 时出错: {e}")
def zoom_rectangle(rectangle, ratio):
"""
缩放矩形
:param rectangle: 原矩形坐标
:param ratio: 缩放比率
:return: 缩放后的矩形坐标
"""
x1, y1, x2, y2 = rectangle
x1 = round(x1 - x1 * ratio)
y1 = round(y1 - y1 * ratio)
x2 = round(x2 + x2 * ratio)
y2 = round(y2 + y2 * ratio)
return [x1, y1, x2, y2]
def chinese_to_money_unit(chinese):
if chinese in ["", ""]:
return 10, False
elif chinese in ["", ""]:
return 100, False
elif chinese in ["", ""]:
return 1000, False
elif chinese == "":
return 10000, True
elif chinese == "亿":
return 100000000, True
else:
return None, False
def chinese_char_to_number(chinese):
if chinese == "":
return 0
elif chinese in ["", ""]:
return 1
elif chinese in ["", ""]:
return 2
elif chinese in ["", ""]:
return 3
elif chinese in ["", ""]:
return 4
elif chinese in ["", ""]:
return 5
elif chinese in ["", ""]:
return 6
elif chinese in ["", ""]:
return 7
elif chinese in ["", ""]:
return 8
elif chinese in ["", ""]:
return 9
else:
return -1
def chinese_to_number(chinese):
length = len(chinese)
result = 0
section = 0
number = 0
unit = [None, False]
for i in range(length):
c = chinese[i]
num = chinese_char_to_number(c)
if num >= 0:
if num == 0:
if number > 0 and unit[0] is not None:
section += number * (unit[0] / 10)
unit = [None, False]
elif number > 0:
raise ValueError(f"{chinese} has bad number '{chinese[i - 1]}{c}' at: {i}")
number = num
else:
unit = chinese_to_money_unit(c)
if unit[0] is None:
raise ValueError(f"{chinese} has unknown unit '{c}' at: {i}")
if unit[1]:
section = (section + number) * unit[0]
result += section
section = 0
else:
unit_number = number
if number == 0 and i == 0:
unit_number = 1
section += unit_number * unit[0]
number = 0
if number > 0 and unit[0] is not None:
number *= unit[0] / 10
return result + section + number
def chinese_money_to_number(chinese_money_amount):
if string_util.blank(chinese_money_amount):
return None
yi = chinese_money_amount.find("")
if yi == -1:
yi = chinese_money_amount.find("")
ji = chinese_money_amount.find("")
fi = chinese_money_amount.find("")
if yi == -1 and ji == -1 and fi == -1:
raise ValueError(f"无法解析: {chinese_money_amount}")
y_str = None
if yi > 0:
y_str = chinese_money_amount[0:yi]
j_str = None
if ji > 0:
if yi >= 0:
if ji > yi:
j_str = chinese_money_amount[yi + 1:ji]
else:
j_str = chinese_money_amount[0:ji]
f_str = None
if fi > 0:
if ji >= 0:
if fi > ji:
f_str = chinese_money_amount[ji + 1:fi]
elif yi > 0:
if fi > yi:
f_str = chinese_money_amount[yi + 1:fi]
else:
f_str = chinese_money_amount[0: fi]
y = 0
j = 0
f = 0
if not string_util.blank(y_str):
y = chinese_to_number(y_str)
if not string_util.blank(j_str):
j = chinese_to_number(j_str)
if not string_util.blank(f_str):
f = chinese_to_number(f_str)
amount = y
amount += j / 10
amount += f / 100
return round(amount, 2)
# 将繁体字转换为简体字
def traditional_to_simple_chinese(traditional_chinese):
converter = OpenCC('t2s')
return converter.convert(traditional_chinese)
def process_request(func):
"""
api通用处理函数
"""
def wrapper(*args, **kwargs):
try:
result = func(*args, **kwargs)
return jsonify(result), 200
except Exception as e:
logging.getLogger('error').error(f'Error: {e}')
return jsonify({'error': str(e)}), 500
return wrapper