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

内置模块和开发规范

1.内置模块

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

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

    # 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,一般称为:序列化

    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.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.字符相关
  • 找到指定字符出现的次数

    #  找到字符串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 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
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
  • 17
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值