python基本语法及一些封装的方法(如果有新的想到的会更新)

字符串转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):

  1. 安装jpype pip install jpype1
  2. 将java程序打成jar包: eclipse 项目右键->export->选择java下的runnable jar file next->选择路径、选择Extract required libraries into generated JAR->finish 后面的提示都点同意之类的
  3. 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转成树的格式

  1. 将结果查出,在内存中转换
    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

  2. 将根节点查出,用递归查询(数据量较大的时候会比较快)
    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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值