DBUtil

  1. import pymysql
  2. class DBUtil():
  3. def __init__(self, dbName):
  4. self.host = '127.0.0.1'
  5. self.port = 3306
  6. self.user = 'root'
  7. self.password = '123456'
  8. self.db = dbName
  9. def __getConnect(self):
  10. return pymysql.connect(self.host, self.user, self.password, self.db)
  11. # 根据dict插入一条数据
  12. def insertOne(self, dict_data, table_name):
  13. global insert_sql
  14. conn = self.__getConnect()
  15. keyStr = '' # 列的字段
  16. valueStr = '' # 行字段
  17. for key in dict_data:
  18. keyStr += ' ' + key + ','
  19. valueStr = valueStr + "%(" + key + ")s,"
  20. keyStr = keyStr.rstrip(',')
  21. valueStr = valueStr.rstrip(',')
  22. try:
  23. cursor = conn.cursor()
  24. insert_sql = "insert into " + table_name + "(" + keyStr + " ) values( " + valueStr + " )"
  25. result = cursor.execute(insert_sql, dict_data)
  26. conn.commit()
  27. cursor.close()
  28. conn.close()
  29. print("执行sql:", insert_sql)
  30. print("插入单条数据成功,影响行数:", result)
  31. except Exception as e:
  32. conn.rollback()
  33. print("DBUtil.insertOne()插入单条操作失败:", e)
  34. print(insert_sql)
  35. raise e
  36. # 批量插入
  37. def insertList(self, dict_data_list, table_name):
  38. for dic_data in dict_data_list:
  39. self.insertOne(dic_data, table_name)
  40. # 根据sql查询 返回嵌套元组 可自行强转list,dict
  41. def select(self, sql):
  42. conn = self.__getConnect()
  43. cursor = conn.cursor(pymysql.cursors.DictCursor)
  44. try:
  45. # 执行SQL语句
  46. cursor.execute(sql)
  47. conn.commit()
  48. # 获取所有记录列表
  49. results = cursor.fetchall()
  50. return results
  51. except Exception as e:
  52. print("DBUtil.select()查询单条记录失败:", e)
  53. raise e
  54. finally:
  55. cursor.close()
  56. conn.close()
  57. # 查个数
  58. def selectCount(self, tableName, whereSql):
  59. sql = "select count(*) from " + tableName + " where "
  60. whereSql = whereSql.strip()
  61. if "where" == whereSql[0:5]:
  62. whereSql = whereSql.replace("where", "").strip()
  63. sql += whereSql
  64. conn = self.__getConnect()
  65. cursor = conn.cursor()
  66. try:
  67. # 执行SQL语句
  68. cursor.execute(sql)
  69. conn.commit()
  70. # 获取所有记录列表
  71. results = cursor.fetchall()
  72. return results[0][0]
  73. except Exception as e:
  74. print("查询记录数失败:", e)
  75. print("DBUtil.selectCount()查询记录数失败:", e)
  76. raise e
  77. finally:
  78. cursor.close()
  79. conn.close()
  80. # 其他
  81. def execute(self, sql):
  82. conn = self.__getConnect()
  83. cursor = conn.cursor()
  84. try:
  85. cursor.execute(sql)
  86. print("执行sql:", sql)
  87. conn.commit()
  88. except Exception as e:
  89. print("执行sql失败:", e)
  90. print("DBUtil.execute()执行失败:", e)
  91. raise e
  92. finally:
  93. cursor.close()
  94. conn.close()

SqliteUtil

  1. import sqlite3
  2. class sqliteUtil():
  3. def __init__(self, dbFile):
  4. self.dbFile = dbFile
  5. def __getConnect(self):
  6. return sqlite3.connect(self.dbFile)
  7. def dict_factory(self, cursor, row):
  8. d = {}
  9. for idx, col in enumerate(cursor.description):
  10. d[col[0]] = row[idx]
  11. return d
  12. # 根据sql查询 返回嵌套元组 可自行强转list,dict
  13. def select(self, sql):
  14. conn = self.__getConnect()
  15. conn.row_factory = self.dict_factory
  16. cursor = conn.cursor()
  17. try:
  18. # 执行SQL语句
  19. cursor.execute(sql)
  20. conn.commit()
  21. # 获取所有记录列表
  22. results = cursor.fetchall()
  23. return results
  24. except:
  25. print("Error: unable to fecth data")
  26. cursor.close()
  27. conn.close()
  28. # 查个数
  29. def selectCount(self, tableName, whereSql):
  30. sql = "select count(*) from " + tableName + " where "
  31. whereSql = whereSql.strip()
  32. if "where" == whereSql[0:5]:
  33. whereSql = whereSql.replace("where", "").strip()
  34. sql += whereSql
  35. conn = self.__getConnect()
  36. cursor = conn.cursor()
  37. try:
  38. # 执行SQL语句
  39. cursor.execute(sql)
  40. conn.commit()
  41. # 获取所有记录列表
  42. results = cursor.fetchall()
  43. return results[0][0]
  44. except:
  45. print("Error: unable to fecth data")
  46. cursor.close()
  47. conn.close()
  48. # 其他
  49. def execute(self, sql):
  50. conn = self.__getConnect()
  51. cursor = conn.cursor()
  52. cursor.execute(sql)
  53. print("执行sql")
  54. conn.commit()
  55. cursor.close()
  56. conn.close()
  57. # 根据dict插入一条数据
  58. def insertOne(self, dict_data, table_name):
  59. global insert_sql
  60. conn = self.__getConnect()
  61. keyStr = '' # 列的字段
  62. valueStr = '' # 行字段
  63. for key in dict_data:
  64. keyStr += ' ' + key + ','
  65. # keyStr += '? ,'
  66. valueStr = valueStr + "'" + dict_data[key] + "',"
  67. keyStr = keyStr.rstrip(',')
  68. valueStr = valueStr.rstrip(',')
  69. try:
  70. cursor = conn.cursor()
  71. insert_sql = "insert into " + table_name + "(" + keyStr + " ) values( " + valueStr + " )"
  72. result = cursor.execute(insert_sql, dict_data)
  73. conn.commit()
  74. cursor.close()
  75. conn.close()
  76. print("执行sql:", insert_sql)
  77. print("插入单条数据成功,影响行数:", result.rowcount)
  78. except Exception as e:
  79. conn.rollback()
  80. print("sqliteUtil.insertOne()插入单条操作失败:", e)
  81. print(insert_sql)
  82. raise e
  83. # 批量插入
  84. def insertList(self, dict_data_list, table_name):
  85. for dic_data in dict_data_list:
  86. self.insertOne(dic_data, table_name)
  87. # 创建表
  88. def createTable(self, sql):
  89. sql_demo = '''
  90. CREATE TABLE password_library(
  91. name text not null,
  92. url text not null,
  93. username text not null,
  94. password text not null,
  95. note text null,
  96. update_time text null,
  97. primary key (name, url, username, password)
  98. );
  99. '''
  100. con = self.__getConnect()
  101. cur = con.cursor()
  102. cur.execute(sql)

XlsUtil

  1. # -*- coding: utf-8 -*-
  2. import xlrd
  3. import xlwt
  4. def read(path):
  5. """
  6. :param path 文件路径
  7. """
  8. workbook = xlrd.open_workbook(path)
  9. data_sheet = workbook.sheets()[0]
  10. row_num = data_sheet.nrows
  11. col_num = data_sheet.ncols
  12. data = []
  13. for i in range(row_num):
  14. row_data = []
  15. for j in range(col_num):
  16. if (i == 0):
  17. continue
  18. row_data.append(data_sheet.cell_value(i, j))
  19. data.append(row_data)
  20. print(data)
  21. return data
  22. def write(data, header, out_path):
  23. """
  24. :param data 表格数据
  25. :param header 表头数据
  26. :param out_path 输出路径
  27. """
  28. wbk = xlwt.Workbook()
  29. sheet = wbk.add_sheet('Sheet1', cell_overwrite_ok=True)
  30. for i in range(len(header)):
  31. sheet.write(0, i, header[i])
  32. for row in range(len(data)):
  33. for col in range(len(data[row])):
  34. sheet.write(row + 1, col, data[row][col])
  35. print(out_path)
  36. wbk.save(out_path)
  37. # test read and write
  38. if __name__ == '__main__':
  39. write([
  40. [1.0, '海底世界', '1.mp4', '1.png',
  41. 'animal:动物,coral:珊瑚,crab:蟹,dolphin:海豚,jellyfish:水母,near:靠近,ocean:海洋,plant:植物,soft:软的,tail:尾巴',
  42. '神秘的海底世界,色彩斑斓,有好多好多的动物,海龟、海豚、海豹、水母…… 鲸是怎么跳得那么高的呢,一起去看看吧~', '免费'],
  43. [2.0, '沙滩上的一天', '2.mp4', '2.png',
  44. 'brown:棕色的,cute:可爱,desk:书桌,great:美好的,late:晚的,seashell:贝壳,sky:天空,put:放,small:小的,star:星星',
  45. '沙滩,阳光,贝壳。我们会在沙滩上看到些什么呢?这一天的旅行是怎么度过呢?让我们一起度过这美好的一天吧。',
  46. '免费'],
  47. [3.0, '沙滩,我来了!', '3.mp4', '3.png',
  48. 'beach:海滩,sea:海,shorts:短裤,summertime:夏日,swimsuit:泳衣,wave:波浪,wear:穿,sunscreen:防晒霜,tank top:背心,sunglasses:太阳眼镜',
  49. '炎炎夏日,最好的去处当然是沙滩啦。为了我们的沙滩旅行,我们需要准备些什么呢?在沙滩上,我们又会做些什么游戏呢?', '会员'], [4.0, '在度假中', '4.mp4', '4.png',
  50. 'beach:海滩,having a picnic:吃野餐,hungry:饿的,sand:沙子,sea:海,looking at:看着,sitting on:坐在…上,looking for:寻找着,together:一起,yard:院子',
  51. '度假时间到了,让我们一去去逛逛,沙滩,花园,大海,让我们一起去看看我们小伙伴的度假时光吧。',
  52. '会员']],
  53. ['编号', '名称', '视频文件', '封面文件', '单词', '简介', '权限'],
  54. 'test_new2.xlsx')

XlsxUtil

  1. # -*- coding: utf-8 -*-
  2. from openpyxl import load_workbook, Workbook
  3. def read(file_path, header=None, header_row=0, sheet_name=None):
  4. """
  5. :param file_path 文件全路径
  6. :param header 表头["name","age","count"]
  7. :param header_row 表头行号
  8. :param sheet_name 工作表名称,为空则默认
  9. """
  10. work_book = load_workbook(file_path)
  11. if sheet_name is None:
  12. work_sheet = work_book.active
  13. else:
  14. work_sheet = work_book[sheet_name]
  15. data_list = []
  16. # 遍历所有行
  17. for i, row in enumerate(work_sheet.rows):
  18. # 跳过表头行
  19. if i > header_row:
  20. if header is None:
  21. data_list.append([cell.value for cell in row])
  22. else:
  23. data_list.append(dict(zip(header, [cell.value for cell in row])))
  24. return data_list
  25. def write(header, data_list, save_path):
  26. """
  27. :param file_path 文件全路径
  28. :param header 表头["name","age","count"]
  29. :param header_row 表头行号
  30. :param sheet_name 工作表名称,为空则默认
  31. """
  32. work_book = Workbook()
  33. work_sheet = work_book.active
  34. for j, item in enumerate(header):
  35. work_sheet.cell(1, j + 1, item)
  36. for row in range(len(data_list)):
  37. for col in range(len(data_list[row])):
  38. work_sheet.cell(row + 2, col + 1, data_list[row][col])
  39. work_book.save(save_path)
  40. if __name__ == '__main__':
  41. header = ['sort', 'type', 'tu', 'number', "model", "xinghao", "jihao", "chejia"] # 固定的标题
  42. result_list = read(r'C:\Users\Administrator\Desktop\存货档案11_4 (1)(1).XLS', header, 2, "Sheet1")
  43. print(result_list)
  44. data_list = [
  45. [1.0, '海底世界', '1.mp4', '1.png', 'animal:动物,coral:珊瑚,crab:蟹,dolphin:海豚,jellyfish:水母,near:靠近,ocean:海洋,plant:植物,soft:软的,tail:尾巴', '神秘的海底世界,色彩斑斓,有好多好多的动物,海龟、海豚、海豹、水母…… 鲸是怎么跳得那么高的呢,一起去看看吧~', '免费'],
  46. [2.0, '沙滩上的一天', '2.mp4', '2.png', 'brown:棕色的,cute:可爱,desk:书桌,great:美好的,late:晚的,seashell:贝壳,sky:天空,put:放,small:小的,star:星星', '沙滩,阳光,贝壳。我们会在沙滩上看到些什么呢?这一天的旅行是怎么度过呢?让我们一起度过这美好的一天吧。', '免费'],
  47. [3.0, '沙滩,我来了!', '3.mp4', '3.png', 'beach:海滩,sea:海,shorts:短裤,summertime:夏日,swimsuit:泳衣,wave:波浪,wear:穿,sunscreen:防晒霜,tank top:背心,sunglasses:太阳眼镜', '炎炎夏日,最好的去处当然是沙滩啦。为了我们的沙滩旅行,我们需要准备些什么呢?在沙滩上,我们又会做些什么游戏呢?', '会员'], [4.0, '在度假中', '4.mp4', '4.png', 'beach:海滩,having a picnic:吃野餐,hungry:饿的,sand:沙子,sea:海,looking at:看着,sitting on:坐在…上,looking for:寻找着,together:一起,yard:院子', '度假时间到了,让我们一去去逛逛,沙滩,花园,大海,让我们一起去看看我们小伙伴的度假时光吧。', '会员']
  48. ]
  49. write(header, data_list, r'C:\Users\Administrator\Desktop\2.xlsx')

FileUtil

  1. # -*- coding: utf-8 -*-
  2. import hashlib
  3. import os
  4. import os.path
  5. from configparser import ConfigParser
  6. # 合并一个文件夹下多个文件
  7. def merge_files(directory_path, outfilePath):
  8. """ directory_path: 文件夹目录 outfilePath: 输出文件路径,包括文件名 """
  9. with open(outfilePath, 'a+', encoding="utf-8") as of:
  10. # root 所指的是当前正在遍历的这个文件夹的本身的地址
  11. # dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录)
  12. # files 同样是 list , 内容是该文件夹中所有的文件(不包括子目录)
  13. # 所以root+file = 目录下每一个文件路径
  14. for root, dirs, files in os.walk(directory_path):
  15. for file in files:
  16. file_path = os.path.join(root, file)
  17. with open(file_path, encoding="utf-8") as f:
  18. # 换行写入
  19. of.write(f.read() + "\n")
  20. # 删除文件夹下的空目录
  21. def remove_empty_dir(path):
  22. for root, dirs, files in os.walk(path):
  23. for item in dirs:
  24. dir_path = os.path.join(root, item)
  25. try:
  26. os.rmdir(dir_path)
  27. except:
  28. pass
  29. # 追加内容到文件头部
  30. def append_head_file(file_path, content):
  31. """ file_path: 文件路径 content: 追加的内容 """
  32. with open(file_path, 'r+', encoding="utf-8") as f:
  33. old = f.read()
  34. f.seek(0)
  35. f.write(content)
  36. f.write(old)
  37. # 获取配置文件对象
  38. def read_config(ini_file):
  39. cfg = ConfigParser()
  40. cfg.read(ini_file, encoding="utf-8")
  41. return cfg
  42. # 读取文件
  43. def read_file(src):
  44. with open(src, "r", encoding="utf-8") as f:
  45. return f.read()
  46. # 读取所有行
  47. def read_lines(src):
  48. with open(src, "r", encoding="utf-8") as f:
  49. return f.readlines()
  50. # m3u文件追加,无文件则创建
  51. def append_m3u8(file_path, img_url, group_name, video_name, video_url):
  52. """ file_path 如 1.m3u """
  53. content = '#EXTINF:-1 tvg-logo="{}" group-title="{}", {}\n{}\n\n'.format(img_url, group_name, video_name, video_url)
  54. if not os.path.exists(file_path):
  55. content = "#EXTM3U\n" + content
  56. with open(file_path, mode="a", encoding="utf-8") as f:
  57. f.write(content)
  58. # 追加文本文件
  59. def append_text(filename, text):
  60. with open(filename, "a", encoding="utf-8") as f:
  61. f.write(text)
  62. # 保存文本文件
  63. def save_text(filename, text):
  64. with open(filename, "w", encoding="utf-8") as f:
  65. f.write(text)
  66. # 保存二进制文件
  67. def save_file(filename, content):
  68. with open(filename, "wb") as f:
  69. f.write(content)
  70. # 文件(夹)是否存在
  71. def exist_path(path):
  72. return os.path.exists(path)
  73. # 获取文件hash
  74. def get_content_hash(file_path):
  75. file_size = os.path.getsize(file_path)
  76. sha1 = hashlib.sha1()
  77. size = 5
  78. temp = size # 输出
  79. with open(file_path, 'rb') as f:
  80. while True:
  81. chunk = f.read(1024 * 1024 * size)
  82. if chunk:
  83. print("文件大小{}M 已读取{}M".format(file_size, temp))
  84. temp += size
  85. sha1.update(chunk)
  86. else:
  87. break
  88. return sha1.hexdigest()

JsonUtil

  1. # -*- coding: utf-8 -*-
  2. import json
  3. # json字符串转对象
  4. def json2obj(text):
  5. return json.loads(text)
  6. # 对象转json字符串
  7. def obj2json(obj, indent=2):
  8. return json.dumps(obj, ensure_ascii=False, indent=indent)
  9. # 将json文件转成对象
  10. def read_json_file_2_obj(src):
  11. with open(src, "r", encoding="utf-8") as f:
  12. return json2obj(f.read())
  13. # 保存json字符串或者对象到文件中
  14. def save_json_file(obj, filename):
  15. if type(obj) != str:
  16. obj = obj2json(obj)
  17. with open(filename, "w", encoding="utf-8") as f:
  18. f.write(obj)

LogUtil

  1. # -*- coding: utf-8 -*-
  2. import logging
  3. import os
  4. import time
  5. def getLogger(log_file_path):
  6. """
  7. :param log_file_path: 日志存放目录
  8. :return: logger对象
  9. """
  10. logger = logging.getLogger(__name__)
  11. logger.setLevel(level=logging.INFO)
  12. if not os.path.exists(log_file_path):
  13. os.makedirs(log_file_path)
  14. log_path = log_file_path + "/output-" + time.strftime("%Y-%m-%d") + ".log"
  15. handler = logging.FileHandler(log_path, encoding="utf-8")
  16. formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
  17. handler.setFormatter(formatter)
  18. logger.addHandler(handler)
  19. stream_handler = logging.StreamHandler()
  20. stream_handler.setFormatter(formatter)
  21. logger.addHandler(stream_handler)
  22. return logger

OtherUtil

  1. # -*- coding: utf-8 -*-
  2. import datetime
  3. import hashlib
  4. import os
  5. import os.path
  6. import random
  7. import time
  8. import traceback
  9. from JsonUtil import *
  10. from RequestUtil import get_resp
  11. # 生成指定范围的日期
  12. def dateRange(beginDate, endDate, split_str):
  13. """ beginDate: '2020/01/01' endDate: '2020/01/08' split_str: '/' """
  14. dates = []
  15. format_str = "%Y{}%m{}%d".format(split_str, split_str)
  16. dt = datetime.datetime.strptime(beginDate, format_str)
  17. date = beginDate[:]
  18. while date <= endDate:
  19. dates.append(date)
  20. dt = dt + datetime.timedelta(1)
  21. date = dt.strftime(format_str)
  22. return dates
  23. # 打印异常信息
  24. def print_exc():
  25. traceback.print_exc()
  26. # md5加密
  27. def md5(text):
  28. m = hashlib.md5()
  29. m.update(text.encode('UTF-8'))
  30. return m.hexdigest()
  31. # 执行cmd命令
  32. def cmd(command):
  33. os.system(command)
  34. # 获取时间戳 毫秒级 长度13
  35. def get_timestamp():
  36. return str(int(time.time() * 1000))
  37. # 输出调试
  38. def print_debug(*obj):
  39. print('\033[1;46m', *obj, '\033[0m')
  40. # 遍历打印
  41. def foreach(data_list):
  42. for data in data_list:
  43. print(data)
  44. # 是否包含中文
  45. def has_contain_chinese(check_str):
  46. for ch in check_str:
  47. if '\u4e00' <= ch <= '\u9fff':
  48. return True
  49. return False
  50. # 切换v2节点
  51. def v2ray_random():
  52. os.system('taskkill /f /t /im v2rayN.exe')
  53. json_file = r"F:/app/v2rayN-Core/guiNConfig.json"
  54. data = read_json_file_2_obj(json_file)
  55. try:
  56. print("原节点:", data["vmess"][data["index"]]["remarks"], end=" ")
  57. except:
  58. pass
  59. try:
  60. data["index"] = random.randint(5, len(data["vmess"]))
  61. print("变更为:", data["vmess"][data["index"]]["remarks"])
  62. except:
  63. pass
  64. save_json_file(data, json_file)
  65. os.startfile('F:/app/v2rayN-Core/v2rayN.exe')
  66. proxies = {
  67. 'http': 'socks5://localhost:10808',
  68. 'https': 'socks5://localhost:10808'
  69. }
  70. try:
  71. resp = get_resp("https://www.google.com.hk/", proxies=proxies, timeout=4)
  72. if resp.status_code != 200:
  73. print("节点连接错误,重新更换")
  74. v2ray_random()
  75. except:
  76. print("节点连接异常,重新更换")
  77. v2ray_random()
  78. # 计时
  79. def timing(target):
  80. print("程序开始计时...")
  81. start = time.time()
  82. target()
  83. print("程序运行耗时: {}s".format(round(time.time() - start, 2)))

RequestUtil

  1. # -*- coding: utf-8 -*-
  2. import re
  3. from urllib.parse import quote, unquote
  4. import requests
  5. from lxml import etree
  6. from requests import utils
  7. from retrying import retry
  8. default_headers = {
  9. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36",
  10. }
  11. # 获取response
  12. def get_resp(url, headers=None, method="get", **kwargs):
  13. if headers is None:
  14. headers = default_headers
  15. return requests.request(method=method, url=url, headers=headers, **kwargs)
  16. # 获取response 重试999次
  17. @retry(stop_max_attempt_number=999)
  18. def get_resp_retry(url, headers=None, method="get", **kwargs):
  19. return get_resp(url, headers, method, **kwargs)
  20. # 保存文件,图片,视频等二进制流
  21. def save_file_with_url(url, filename, headers=None):
  22. with open(filename, "wb") as f:
  23. f.write(get_resp(url, headers).content)
  24. # 保存文本,网页
  25. def save_text_with_url(url, filename, headers=None):
  26. with open(filename, "w", encoding="utf-8") as f:
  27. f.write(get_resp(url, headers).text)
  28. # 获取xpath对象
  29. def get_xpath(html_str):
  30. return etree.HTML(html_str)
  31. # 格式化字符串
  32. def formatText(text):
  33. return re.sub(r"[/\\:*?\"<>|]", "_", text)
  34. # cookie字符串转对象
  35. def cookie_dict(resp):
  36. return utils.dict_from_cookiejar(resp.cookies)
  37. # 对象转cookie字符串
  38. def dict_to_cookie(cookie_dict):
  39. cookies_str = ""
  40. for cookie in cookie_dict:
  41. cookies_str += cookie + "=" + cookie_dict[cookie] + "; "
  42. return cookies_str[0:-1]
  43. # url参数编码
  44. def url_encode(value):
  45. return quote(value)
  46. # url参数解码
  47. def url_decode(value):
  48. return unquote(value)
  49. # 将浏览器复制的headers参数 格式化成dict
  50. def header_format(headers_str):
  51. return {x.split(':')[0].strip(): ("".join(x.split(':')[1:])).strip().replace('//', "://") for x in
  52. headers_str.strip().split('\n')}

部署全局工具类

  1. import shutil
  2. if __name__ == '__main__':
  3. py_list = ["FileUtil.py", "JsonUtil.py", "OtherUtil.py", "RequestUtil.py", "DBUtil.py", "LogUtil.py",
  4. "XlsUtil.py", "XlsxUtil.py", "SqliteUtil.py"]
  5. dic = "C:/Users/Administrator/AppData/Local/Programs/Python/Python38/Lib/site-packages"
  6. for py in py_list:
  7. print("部署:", py)
  8. shutil.copy(py, dic)

引入方式

  1. from FileUtil import *
  2. from JsonUtil import *
  3. from OtherUtil import *
  4. from RequestUtil import *