字符串转decimal
Decimal('10.064').quantize(Decimal('100.00'), rounding="ROUND_HALF_UP")
计算文件的md5:
import hashlib
hashlib.md5(open(filename, 'r').read()).hexdigest()
计算zip中某个文件的md5
def get_shp_md5(zip_name):
"""
获取zip中shp的md5
"""
zip_obj = zipfile.ZipFile(zip_name, "r")
for i in zip_obj.filelist:
if i.filename.endswith('shp') or i.filename.endswith('SHP'):
return hashlib.md5(zip_obj.open(i.filename, 'r').read()).hexdigest()
python计算时间差,可计算出 年、月、日、周、时、分、秒
import datetime
from dateutil.relativedelta import relativedelta
a = datetime.datetime.strptime('2023-05-18', '%Y-%m-%d')
b = datetime.datetime.strptime('2019-05-17', '%Y-%m-%d')
c = relativedelta(dt1=a, dt2=b)
如下是返回结果
时间格式转换
def datetime_fmt(t, fmt='%Y-%m-%d'):
if t.tzinfo:
r = localtime(t).strftime(fmt)
else:
r = t.strftime(fmt)
return r
获取model中的字段
def get_model_col_info(*model_list, keys=[]):
check_dict = dict()
for model in model_list:
for field in model._meta.fields:
type_field = type(field)
if field.attname in keys or not keys:
check_dict[field.attname] = {'type': type_field, 'name': field.verbose_name,
'max_length': field.max_length,
'choices': list(dict(field.choices).keys()),
'choices_dict': dict(field.choices),
'choices_dict_inverse': {v: k for k, v in dict(field.choices).items()},
'null': field.null}
if type_field in (ForeignKey,):
check_dict[field.attname]['choices'] = list(
field.related_model.objects.values_list(field.related_fields[0][1].attname, flat=True))
return check_dict
python调用java程序(有些时候,比如对接对方用java进行加密,同样的方法python不支持或者计算出的结果和java计算出的不一样,这时,就需要在python环境中调用java的方法)
大概思路(只支持python3):
- 安装jpype pip install jpype1
- 将java程序打成jar包: eclipse 项目右键->export->选择java下的runnable jar file next->选择路径、选择Extract required libraries into generated JAR->finish 后面的提示都点同意之类的
- python调用java
import jpype
import os
jar_path = os.path.abspath('.') + '/AddTwoNumbers.jar' # 获取jar包绝对路径
jpype.startJVM('usr/local/java/jdk.../jre/lib/amd64/server/libjvm.so', '-ea', '-Djava.class.path=%s' % jar_path)
# 加载java虚拟机,第一个参数是Java的jdk安装位置,可以通过env | prep JAVA_HOME来查看;第二个参数仿照例子来写;第三个参数为jar包的绝对路径;
java_class = jpype.JClass('AddTwoNumsClass') # 通过输入类名称来获取指定的Java类
result = java_class.addTwoNumsFunc(1, 2) # 通过函数名称来调用该类的指定函数
jpype.shutdownJVM() # 关闭Java虚拟机,如果不写会在python程序退出时自动关闭
将mptt转成树的格式
-
将结果查出,在内存中转换
def list_to_tree(data_list, parent_field=“parent_id”, node_field=“id”, root=None):
“”"
非递归 先把家族列表取出来 再转换成树
parent_field: 父节点字段 类似于 parent_id
node_field: 父节点被指向的字段 类似于 id
root: 根节点的id
“”"
if not data_list:
return list()
root_level = min(data[“level”] for data in data_list)
root_list = [data for data in data_list if data[“level”] == root_level] if not root else [i for i in data_list if i.get(node_field) == root]
for i in data_list:
i[‘children’] = [j for j in data_list if i.get(node_field) == j.get(parent_field)] # 将子节点挂接上
if not i.get(“is_dir”) and not i[‘children’]:
i.pop(‘children’)
return root_list -
将根节点查出,用递归查询(数据量较大的时候会比较快)
def get_tree(base_obj, to_dict_func, **to_dict_func_params):
“”"
递归
base_obj: 根节点
to_dict_func: 对象转换成字典的方法
to_dict_func_params: 调用对象转换成字典的方法 除了对象外的 额外的参数
“”"
data = to_dict_func(base_obj, **to_dict_func_params)
if data.get(‘is_leaf_node’) is False:
if not data.get(“children”):
data[“children”] = list()
for d in base_obj.children.filter(is_del=False, is_res_web=True).order_by(‘seq’):
data[“children”].append(get_tree(d, to_dict_func, **to_dict_func_params))
return data