内置模块和开发规范(3)

内置模块和开发规范

1.内置模块

1.json
  • json模块,是python内部的一个模块,可以将python的数据格式转换为json格式的数据,也可以将json格式转换为python的数据格式

  • json格式,是一个数据格式(本质上就是字符串,常用于网络数据传输)

    # Python中的数据类型格式
    import jsondata = [{"id": 1, "name": "Ailke", "age": 18},{"id": 2, "name": "Ailkes", "age": 25},('Ailke', 123)
    ]# JSON格式
    value = '[{"id": 1, "name": "Ailke", "age": 18}, {"id": 2, "name": "Ailkes", "age": 25}, ["Ailke", 123]'
    print(json.dumps(data))
    
1.核心功能
  • Python数据类型转化为json,一般称为:序列化

    data = [{"id": 1, "name": "Ailke", "age": 18},{"id": 2, "name": "Ailkes", "age": 25},{"id": 3, "name": "李四", "age": 30}
    ]
    '''
    ensure-ascii 默认是True,输出中所有的非ASCII字符都会被转义;为False,则原样输出
    '''
    res = json.dumps(data, ensure_ascii=False)
    print(res)
    
  • json格式转换为Python数据类型,一般称为: 反序列化

    data_string = '[{"id": 1, "name": "Ailke", "age": 18}, {"id": 2, "name": "Ailkes", "age": 25}, {"id": 3, "name": "李四", "age": 30}]'
    data_list = json.loads(data_string)
    print(data_list)  # [{'id': 1, 'name': 'Ailke', 'age': 18}, {'id': 2, 'name': 'Ailkes', 'age': 25}, {'id': 3, 'name': '李四', 'age': 30}]
    
2.类型要求
  • Python的数据类型转换为json格式,对数据类是有要求的,默认只支持

    PythonJSON
    dictobject
    list, tuplearray
    strstring
    int, floatnumber
    Truetrue
    Falsefalse
    Nonenull
  • 自定义JSONEncoder

    # 其他类型想要得到支持,需要自定义JSONEncoder才能实现
    data = [{"id": 2, "name": "Ailke", "age": 18, "size": Decimal("180.5"), "ctime": datetime.now()},{"id": 3, "name": "Ailkes", "age": 30, "size": Decimal("170"), "ctime": datetime.now()}
    ]class MyJsonEncoder(json.JSONEncoder):def default(self, o):if type(o) == Decimal:return str(o)elif type(o) == datetime:return o.strftime("%Y-%M-%d")return super().default(o)'''
    [{"id": 2, "name": "Ailke", "age": 18, "size": "180.5", "ctime": "2024-16-24"}, 
    {"id": 3, "name": "Ailkes", "age": 30, "size": "170", "ctime": "2024-16-24"}]
    '''
    res = json.dumps(data, cls=MyJsonEncoder)
    print(res)
    
3.其他功能
  • json模块中常用的是

    • json.dumps,序列化生成一个字符串

    • json.loads,反序列化生成Python数据类型

    • json.dump,将数据序列化并写入文件(不常用)

    • json.load,读取文件中的数据并反序列化为python的数据类型(不常用)

      data = [{"id": 2, "name": "Ailke", "age": 18, "size": Decimal("180.5"), "ctime": datetime.now()},{"id": 3, "name": "Ailkes", "age": 30, "size": Decimal("170"), "ctime": datetime.now()}
      ]class MyJsonEncoder(json.JSONEncoder):def default(self, o):if type(o) == Decimal:return str(o)elif type(o) == datetime:return o.strftime("%Y-%M-%d")return super().default(o)
      # json.dump  将数据序列化并写入文件
      file_object = open(os.path.join(os.getcwd(), "stuInfo.json"), mode="w", encoding="utf-8")
      json.dump(data, file_object, cls=MyJsonEncoder)
      file_object.close()# json.load  读取文件中的数据并反序列化为python的数据类型
      with open(os.path.join(os.getcwd(), "stuInfo.json"), mode="r", encoding="utf-8") as f:data = json.load(f)print(data)
      
2.时间处理
  • UTC/GMT: 世界时间

  • 本地时间: 本地时区的时间

  • Python中关于时间处理的模块有两个,分别是time和datetime

1.time
# 获取时间戳
timestamp = time.time()
print(timestamp)# 获取当前的时区
tz = time.tzname
print(tz)# 停止n秒,再执行后续代码
# time.sleep(10)
print('等待10s结束')
2.datetime
# 获取当前本地时间
currenttime = datetime.now()
print(currenttime)  # 2024-03-24 15:45:55.522394# 当前东7区时间
tz = timezone(timedelta(hours=7))
currenttime = datetime.now(tz)
print(currenttime)  # 2024-03-24 14:48:14.024268+07:00# 当前UTC时间  datetime.utcnow()过时
currenttime = datetime.now(timezone.utc)
print(currenttime)  # 2024-03-24 08:07:07.529889+00:00# 时间的加减  datetime类型 + timedelta类型
futuretime = currenttime + timedelta(days=140, hours=2, minutes=5)
print(futuretime)  # 2024-08-11 10:16:58.885019+00:00# 让addr_currenttime拥有时区属性
# addr_currenttime = datetime.now(timezone(timedelta(hours=8)))
addr_currenttime = datetime.now()
local_tz = ZoneInfo('Asia/Shanghai')
# 下面两种方法效果一样
# addr_currenttime = addr_currenttime.replace(tzinfo=local_tz)
addr_currenttime = addr_currenttime.astimezone(local_tz)timedifference = addr_currenttime - currenttime
print(timedifference.days, timedifference.seconds / 60 / 60, timedifference.microseconds)
1.字符串
# 时间格式化  将字符串格式的时间转换为datetime格式时间
text = "2020-12-12"
# %Y 年  %m 月  %d 天
passtime = datetime.strptime(text, '%Y-%m-%d')
print(passtime)  # 2020-12-12 00:00:00# datetime格式转为字符串格式
currenttime = datetime.now()
text = currenttime.strftime("%Y-%m-%d %H:%M:%S")
print(text)  # 2024-03-27 09:39:38
2.时间戳
# 时间戳格式转换为datetime格式
ctime = time.time()
currenttime = datetime.fromtimestamp(ctime)
print(currenttime)  # 2024-03-27 09:41:24.249599# datetime格式转化为时间戳
text = "2023-12-25 14:48:56"
passtime = datetime.strptime(text, "%Y-%m-%d %H:%M:%S")
ctime = passtime.timestamp()
print(ctime)  # 1703486936.0

# 测试代码import hashlib
import os.pathfrom openpyxl import workbook, load_workbook
from datetime import datetimeBASE_DIR = os.path.join(os.environ['SystemDrive'], '/Users/梁/Desktop')
FILES_NAME = "测试时间.xlsx"def md5(origin):hash_object = hashlib.md5("getuserinfo".encode("utf-8"))hash_object.update(origin.encode("utf-8"))return hash_object.hexdigest()def register(username, password, address):db_file_path = os.path.join(BASE_DIR, FILES_NAME)if os.path.exists(db_file_path):wb = load_workbook(db_file_path)sheet = wb.worksheets[0]next_row_position = sheet.max_row + 1else:wb = workbook.Workbook()sheet = wb.worksheets[0]sheet.title = "测试时间表格"next_row_position = 1user = sheet.cell(next_row_position, 1)user.value = usernamepwd = sheet.cell(next_row_position, 2)pwd.value = md5(password)addr = sheet.cell(next_row_position, 3)addr.value = addressctime = sheet.cell(next_row_position, 4)ctime.value = datetime.now().strftime("%Y-%m-%d %H:%M:%S")wb.save(db_file_path)def run():while True:username = input("请输入用户名:")if username.upper() == 'Q':breakpassword = input("请输入密码:")address = input("请输入地址:")register(username, password, address)if __name__ == '__main__':run()
3.正则表达式相关
1.正则表达式
1.字符相关
  • 找到指定字符出现的次数

    #  找到字符串Ailke出现的次数
    text = "Ailke学习了不少开发语言,但是Ailke很笨,很多东西都不会写;Ailke有时也会思考自己到底在做什么?"
    data_list = re.findall('Ailke', text)
    print(len(data_list))  # 3
    
  • [abc] 匹配a或b或c字符

    # [abc]匹配a或b或c字符
    text = "Ailke最开始只会简单abcd,通过后期Jerry老师的教导,学会了abcdefhg...;但是Ailke有时还是要忘记c"
    data_list = re.findall('[abc]', text)
    print(data_list)  # ['a', 'b', 'c', 'a', 'b', 'c', 'c']
    
  • [^abc] 匹配除了abc以外的其他字符

    # [^abc]匹配除abc之外的其他字符
    text = "Ailke不懂什么是abcd字符"
    data_list = re.findall('[^abc]', text)
    print(data_list)  # ['A', 'i', 'l', 'k', 'e', '不', '懂', '什', '么', '是', 'd', '字', '符']
    
  • [a-z] 匹配a~z的任意字符([0-9]也可以)

    # [a-z] 匹配a~z的任意字母([0~9]也可以)
    text = "有些即便是只要20岁,也能到达不一样的高度;有些人即便老得没办法,还是不知道abcd,比如Ailke"
    data_list = re.findall('[a-z]', text)
    print(data_list)  # ['a', 'b', 'c', 'd', 'i', 'l', 'k', 'e']
    
  • . 代指除换行符以外的任意字符

    # .代指除换行符以外的任意字符
    text = "Ailke在学习Pythonpbncbn吗?他那么蠢咋学会啊! \n 慢慢看看吧! Python"
    data_list = re.findall('.', text)
    print(data_list)# 贪婪匹配
    data_list = re.findall('P.+n', text)
    print(data_list)  # ['Pythonpbncbn', 'Python']# 非贪婪匹配 匹配到符合条件的,停止匹配;等待下一次匹配
    data_list = re.findall('P.+?n', text)
    print(data_list)  # ['Python', 'Python']
    
  • \w 代指字母或数字或下划线(汉字)

    # \w代指字母或数字或下划线(汉字)
    text = "Ailke学习Python,听说,他还会JAVA;话说,Ailke真的会吗?"
    data_list = re.findall("学\\w+n", text)
    print(data_list)  # ['学习Python']
    
  • \d 代指数字

    # \d代指数字
    text = "Ailke的手机号是181...,他以前的手机号是191的"
    data_list = re.findall("\\d+", text)
    print(data_list)  # ['181', '191']
    
  • \s 代指任意的空白符,包含括号、制表符等

    # \s代指任意的空白符,包括空格、制表符等
    text = "Python JAVA TEXT"
    data_list = re.findall("P\\w+\\s\\w+", text)
    print(data_list)  # ['Python JAVA']
    
2.数量相关
  • *重复0次或更多次

    # 数量相关
    # *重复0次或更多次
    text = "Ailke喜欢学习编程,但是一直都不是很理想;但是Ailke不想放弃"
    data_list = re.findall("A\\w*程", text)
    print(data_list)  # ['Ailke喜欢学习编程']
    
  • +重复1次或更多次

    # + 重复1次或更多次
    text = "Ailke不喜欢别人一直逼逼叨叨"
    data_list = re.findall("A\\w+人", text)
    print(data_list)  # ['Ailke不喜欢别人']
    
  • ?重复0次或1次

    # ? 重复0次或1次
    text = "Ailke真的不喜欢别人一直说话"
    data_list = re.findall("A\\w?", text)
    print(data_list)  # ['Ai']
    
  • {n}重复n次

    # {n} 重复n次
    text = "Ailke喜欢的营运数字是868686845"
    data_list = re.findall("A\\w+是\\d{3}", text)
    print(data_list)  # ['Ailke喜欢的营运数字是868']
    
  • {n, }重复n次或更多次

    # {n,}重复n次或更多次
    text = "Ailke的电话号码是18160**,猜中的概率很小的"
    data_list = re.findall("A\\w{10}\\d{3}", text)
    print(data_list)  # ['Ailke的电话号码是181']# {n,m}重复n到m次
    
  • {n,m}重复n到m次

3.括号(分组)
  • 提取数据区域

    #括号(分组)
    text = "Tom的电话号码是1869636452632"
    data_list = re.findall("364(5\\d{3})", text)
    print(data_list)  # ['5263']
    data_list = re.findall("69(63)6(\\d{2})", text)
    print(data_list)  # [('63', '45')]
    
  • 获取指定区域 + 或条件

    # 获取指定区域+ 或条件text = "Ailke真的很喜欢编程,他喜欢很多编程语言Python JAVA C C++ 等"
    data_list = re.findall("A\\w+.+(P\\w+)\\s(J\\w*)", text)
    print(data_list)  # [('Python', 'JAVA')]
    
4.开始与结束
# 起始(^)和结束($)
text = "今天的天气真的很不错,希望太阳在大一点"
data_list = re.findall("^今\\w{2}(\\w{2})\\w{3}", text)
print(data_list)  # ['天气']
5.特殊字符
  • 正则表达式中 * . \ { } ( )等都具有特殊的含义,所以如果想要在正则中匹配这种指定的字符,需要转义

    # 特殊字符
    text = "下面内容是要点,(3)寻找符合当前社会的价值观"
    data_list = re.findall("^下\\w+.(\\(\\d\\)\\w{2,})", text)
    print(data_list)  # ['(3)寻找符合当前社会的价值观']
    
2.re模块
  • python中提供了re模块,可以处理正则表达式并对文本进行处理

  • findall,获取匹配到的所有数据

  • match,从起始位置开始匹配,匹配成功返回第一个对象,未匹配成功返回None

    # match函数
    text = "学习Python,学习JAVA,学习C++,学习很多很多东西"
    data = re.match("学习[PJ]\\w+", text)
    print(data.group())text = "大小逗2B最逗3B欢乐"
    data = re.match("逗\\dB", text)
    print(data)  # None
    
  • search,浏览整个字符串去匹配第一个,未匹配成功返回None

    text = "大小逗2B最逗3B欢乐"
    data = re.search("逗\\dB", text)
    if data:print(data.group())  # 逗2B
    
  • sub,替换匹配成功的位置

    text = "Ailke很不喜欢学习"
    data = re.sub("不\\w{2}","喜欢", text)
    print(data)  # Ailke很喜欢学习
    
  • split 根据匹配成功的位置进行分割

    text = "Ailke很不喜欢学习"
    data = re.split("不\\w{2}", text)
    print(data)  # ['Ailke很', '学习']
    
  • finditer

    import re  # 假设我们要查找所有单词"apple"的出现位置  
    pattern = r'\bapple\b'  # 使用单词边界\b来确保匹配整个单词"apple"  
    text = "I have an apple. The apple is red. Apple pie is delicious."  # 使用finditer查找所有匹配项  
    matches = re.finditer(pattern, text)  # 遍历匹配项并打印结果  
    for match in matches:  print(f"Found '{match.group()}' at positions {match.start()} to {match.end()-1}")
    

2.项目开发规范

1.单文件应用
  • 基于python开发简单应用时(一个py文件就能搞定)

    """
    文件注释
    """import re
    import randomimport requests
    from openpyxl import load_workbookDB = "XXX"def do_something():""" 函数注释 """# TODO 待完成时,下一期实现xxx功能for i in range(10):passdef run():""" 函数注释 """# 对功能代码进行注释text = input(">>>")print(text)if __name__ == '__main__':run()
    
2.单文件执行文件
  • 创建一个新项目 crm
crm
|--app.py	文件,程序的主文件
|--config.py 文件,配置文件
|--db		文件夹,存放数据
|--files	文件夹,存放文件
|--src		包,业务处理代码
|--utils	包,公共功能
3.多可执行文件
  • 创建一个新项目 killer
killer
|--bin				文件夹,存放多个主文件(可运行)
|	|--app1.py
|	|--app2.py
|--config			包,配置文件
|	|--__init__.py
|	|--settings.py
|--db				文件夹,存放数据
|--files			文件夹,存放文件
|--src				包,业务代码
|	|--__init__.py
|--utils			包,公共功能|--__init__.py

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/807029.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记录一个Kafka客户端Offset Explore连不上的问题

CSDN上的其他人不知道咋想的,这么简单一个问题都要写个收费的回答。那我来写个不收费的, 我昨天把集群重装了一下,再连这个工具就连不上了(你先把zk和kafka在集群启起来),报错截图如下: 英文翻…

中位数和众数-第12届蓝桥杯选拔赛Python真题精选

[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第49讲。 中位数和众数&…

MySQL 用来查询表结构的 SQL 语句

文章目录 背景: 在项目的总体设计中, 关于数据库设计中的逻辑设计, 需要用到表结构,可以使用如下 SQL 语句直接查询。 SELECTTABLE_SCHEMA as 数据库名,TABLE_NAME as 表名,ORDINAL_POSITION as 序号,COLUMN_NAME as 字段名,COLUM…

Leetcode-1702-修改后的最大二进制字符串-c++

题目详见https://leetcode.cn/problems/maximum-binary-string-after-change/ 官方题解 我们从字符串左边第一位开始依次遍历,如果是 1 则不用改变,如果是 0,我们则想办法将其变成 1。 我们会找到下一位出现的 0,利用操作 2 我们…

git修改某个远端服务器的地址的方式以及4种remote

假设本地有1个远端仓库,默认一般叫origin,原来对应的git url是:gitxxx.git # 查看方式: git remote -v# 修改方式: git地址url指定远程仓库:(常用) git remote set-url origin gitn…

大宋咨询(深圳神秘顾客调查)开展某银行分行神秘顾客检查

银行神秘顾客检查是一项重要的服务质量控制活动,旨在通过模拟客户体验来评估银行服务的质量和水平。这种检查方式有助于银行发现问题、改进服务,提升客户满意度。下面将详细介绍如何进行银行神秘顾客检查。大宋咨询(深圳银行神秘顾客公司&…

深入浅出Redis(十二):Redis的排序命令Sort

引言 Redis是一款快速、优秀的键值对数据库,提供丰富的数据结构能在各种场景下实现功能,同时也提供丰富的命令来完成各种各样的功能,本篇文章将深入浅出的解析Sort命令的原理以及使用 原理 Sort 命令用来对list、set、zset对象进行排序&am…

springboot组件的单例模式和分布式分析

springboot组件的单例模式和分布式分析 一、基本概念 在Spring Boot应用中,单例模式是非常常见的一种设计模式,它被广泛应用于Bean的生命周期管理。Spring容器默认会将所有的Component、Service、Repository和Controller注解标记的类作为单例对象进行实…

JavaEE实验三:3.5学生信息查询系统(动态Sql)

题目要求: 使用动态SQL进行条件查询、更新以及复杂查询操作。本实验要求利用本章所学知识完成一个学生信息系统,该系统要求实现3个以下功能: 1、多条件查询: 当用户输入的学生姓名不为空,则根据学生姓名进行学生信息的查询; 当用户…

Day:006(1) | Python爬虫:高效数据抓取的编程技术(爬虫工具)

selenium介绍与安装 Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器&am…

C++11 设计模式1. 模板方法(Template Method)模式学习。UML图

一 什么是 "模板方法(Template Method)模式" 在固定步骤确定的情况下,通过多态机制在多个子类中对每个步骤的细节进行差异化实现,这就是模板方法模式能够达到的效果。 模板方法模式属于:行为型模式。 二 &…

个人网站开发记录(七)——三系统后端nodejs+express

前言 这种已经完全工程化了的()后端其实已经没啥好说的了,因为就是单纯的写接口然后调用接口就完事了! 正文 唯一值得一提的大概是我在写这个系统的时候搞了https的链接,具体来说就是先申请一个ssl证书,…

2024-4-10-day13-实战:商城首页(上)

个人主页:学习前端的小z 个人专栏:HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! 文章目录 ✍作业 ✍作业 .bg-backward {width: 60px; height: 60px;background: url(..…

Unity 通过权重做随机

我们可以通过Random.Range方法结合权重来实现随机选择。具体步骤如下: 首先,创建一个数组,其中包含你要选择的项目,并为每个项目分配一个权重值。 计算所有权重值的总和。 使用Random.Range生成一个介于0和总权重之间的随机数。…

Jmeter常用参数化技巧总结

JMeter是一个开源的Java应用,用于加载功能测试和性能测量。在测试过程中,我们经常需要对测试数据进行参数化,以便模拟不同的用户场景和数据输入。以下是一些常用的JMeter参数化技巧总结: CSV Data Set Config: 使用CSV…

Oracle通过函数动态拼接SQL并返回执行结果

最近接到优化程序的工作,程序使用kettle编写,有一段业务处理,需要使用kettle遍历动态拼接执行SQL(数据库(oracle)中存储SQL的查询条件,例如:AND ITEMK001);测试发现kettle遍历非常耗时(情理中,遍…

常见分类算法

一、ChatGPT 在人工智能和机器学习领域,分类算法是一种监督学习技术,用来识别输入数据所属的类别。以下是一些常见的分类算法: 1. 决策树(Decision Trees): 决策树通过创建一系列的问题或决策,来将数据…

让我看看谁还在用conda?

目录 前言下载方式安装命令使用方式及小技巧一些常用的命令安装软件小技巧一些关于conda环境的建议 最后 前言 相信大家在用conda的时候都遇到过各种各样的问题吧,比如创建环境非常缓慢、安装软件并解析依赖的速度非常感人等,有时候等待半小时甚至更久最…

mysql查询某条记录所在的行号

有时候我们想知道某条记录在表中的多少行,这样我们就可以开始继续上一次的任务了。 下面是SQL,可以直接执行,把表名改成自己真实的表名就好了,还得注意下子查询的排序,也得按自己真实需求来即可: SET row…

WIN11 安装配置 linux 子系统 Ubuntu 图形界面 桌面系统

WIN11 安装配置 linux 子系统 Ubuntu 图形界面 桌面系统 在适用于 Linux 的 Windows 子系统上运行 Linux GUI 应用 1、先决条件: 1)需要使用 Windows 10 版本 19044 或 Windows 11 才能使用此功能。 2)已安装适用于 vGPU 的驱动程序。 若…