内置模块和开发规范
1.内置模块
1.json
-
json模块,是python内部的一个模块 ,可以将python的数据格式 转换为json格式的数据,也可以将json格式转换为python的数据格式
-
json格式,是一个数据格式(本质上就是字符串,常用于网络数据传输)
python# Python中的数据类型格式 import json data = [ {"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,一般称为:序列化
pythondata = [ {"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数据类型,一般称为: 反序列化
pythondata_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格式,对数据类是有要求的,默认只支持
Python JSON dict object list, tuple array str string int, float number True true False false None null -
自定义JSONEncoder
python# 其他类型想要得到支持,需要自定义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的数据类型(不常用)
pythondata = [ {"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
python
# 获取时间戳
timestamp = time.time()
print(timestamp)
# 获取当前的时区
tz = time.tzname
print(tz)
# 停止n秒,再执行后续代码
# time.sleep(10)
print('等待10s结束')
2.datetime
python
# 获取当前本地时间
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.字符串
python
# 时间格式化 将字符串格式的时间转换为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.时间戳
python
# 时间戳格式转换为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
python
# 测试代码
import hashlib
import os.path
from openpyxl import workbook, load_workbook
from datetime import datetime
BASE_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 + 1
else:
wb = workbook.Workbook()
sheet = wb.worksheets[0]
sheet.title = "测试时间表格"
next_row_position = 1
user = sheet.cell(next_row_position, 1)
user.value = username
pwd = sheet.cell(next_row_position, 2)
pwd.value = md5(password)
addr = sheet.cell(next_row_position, 3)
addr.value = address
ctime = 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':
break
password = input("请输入密码:")
address = input("请输入地址:")
register(username, password, address)
if __name__ == '__main__':
run()
3.正则表达式相关
1.正则表达式
1.字符相关
-
找到指定字符出现的次数
python# 找到字符串Ailke出现的次数 text = "Ailke学习了不少开发语言,但是Ailke很笨,很多东西都不会写;Ailke有时也会思考自己到底在做什么?" data_list = re.findall('Ailke', text) print(len(data_list)) # 3
-
[abc] 匹配a或b或c字符
python# [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以外的其他字符
python# [^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]也可以)
python# [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']
-
. 代指除换行符以外的任意字符
python# .代指除换行符以外的任意字符 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 代指字母或数字或下划线(汉字)
python# \w代指字母或数字或下划线(汉字) text = "Ailke学习Python,听说,他还会JAVA;话说,Ailke真的会吗?" data_list = re.findall("学\\w+n", text) print(data_list) # ['学习Python']
-
\d 代指数字
python# \d代指数字 text = "Ailke的手机号是181...,他以前的手机号是191的" data_list = re.findall("\\d+", text) print(data_list) # ['181', '191']
-
\s 代指任意的空白符,包含括号、制表符等
python# \s代指任意的空白符,包括空格、制表符等 text = "Python JAVA TEXT" data_list = re.findall("P\\w+\\s\\w+", text) print(data_list) # ['Python JAVA']
2.数量相关
-
*重复0次或更多次
python# 数量相关 # *重复0次或更多次 text = "Ailke喜欢学习编程,但是一直都不是很理想;但是Ailke不想放弃" data_list = re.findall("A\\w*程", text) print(data_list) # ['Ailke喜欢学习编程']
-
+重复1次或更多次
python# + 重复1次或更多次 text = "Ailke不喜欢别人一直逼逼叨叨" data_list = re.findall("A\\w+人", text) print(data_list) # ['Ailke不喜欢别人']
-
?重复0次或1次
python# ? 重复0次或1次 text = "Ailke真的不喜欢别人一直说话" data_list = re.findall("A\\w?", text) print(data_list) # ['Ai']
-
{n}重复n次
python# {n} 重复n次 text = "Ailke喜欢的营运数字是868686845" data_list = re.findall("A\\w+是\\d{3}", text) print(data_list) # ['Ailke喜欢的营运数字是868']
-
{n, }重复n次或更多次
python# {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.括号(分组)
-
提取数据区域
python#括号(分组) 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')]
-
获取指定区域 + 或条件
python# 获取指定区域+ 或条件 text = "Ailke真的很喜欢编程,他喜欢很多编程语言Python JAVA C C++ 等" data_list = re.findall("A\\w+.+(P\\w+)\\s(J\\w*)", text) print(data_list) # [('Python', 'JAVA')]
4.开始与结束
python
# 起始(^)和结束($)
text = "今天的天气真的很不错,希望太阳在大一点"
data_list = re.findall("^今\\w{2}(\\w{2})\\w{3}", text)
print(data_list) # ['天气']
5.特殊字符
-
正则表达式中 * . \ { } ( )等都具有特殊的含义,所以如果想要在正则中匹配这种指定的字符,需要转义
python# 特殊字符 text = "下面内容是要点,(3)寻找符合当前社会的价值观" data_list = re.findall("^下\\w+.(\\(\\d\\)\\w{2,})", text) print(data_list) # ['(3)寻找符合当前社会的价值观']
2.re模块
-
python中提供了re模块,可以处理正则表达式并对文本进行处理
-
findall,获取匹配到的所有数据
-
match,从起始位置开始匹配,匹配成功返回第一个对象,未匹配成功返回None
python# 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
pythontext = "大小逗2B最逗3B欢乐" data = re.search("逗\\dB", text) if data: print(data.group()) # 逗2B
-
sub,替换匹配成功的位置
pythontext = "Ailke很不喜欢学习" data = re.sub("不\\w{2}","喜欢", text) print(data) # Ailke很喜欢学习
-
split 根据匹配成功的位置进行分割
pythontext = "Ailke很不喜欢学习" data = re.split("不\\w{2}", text) print(data) # ['Ailke很', '学习']
-
finditer
pythonimport 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文件就能搞定)
python""" 文件注释 """ import re import random import requests from openpyxl import load_workbook DB = "XXX" def do_something(): """ 函数注释 """ # TODO 待完成时,下一期实现xxx功能 for i in range(10): pass def run(): """ 函数注释 """ # 对功能代码进行注释 text = input(">>>") print(text) if __name__ == '__main__': run()
2.单文件执行文件
- 创建一个新项目 crm
tex
crm
|--app.py 文件,程序的主文件
|--config.py 文件,配置文件
|--db 文件夹,存放数据
|--files 文件夹,存放文件
|--src 包,业务处理代码
|--utils 包,公共功能
3.多可执行文件
- 创建一个新项目 killer
tex
killer
|--bin 文件夹,存放多个主文件(可运行)
| |--app1.py
| |--app2.py
|--config 包,配置文件
| |--__init__.py
| |--settings.py
|--db 文件夹,存放数据
|--files 文件夹,存放文件
|--src 包,业务代码
| |--__init__.py
|--utils 包,公共功能
|--__init__.py