翼度科技»论坛 编程开发 python 查看内容

day12-内置模块和开发规范

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
1. 内置模块

1.1 json

json模块,是python内部的一个模块,可以将python的数据格式 转换为json格式的数据,也可以将json格式的数据转换为python的数据格式。
json格式,是一个数据格式(本质上就是个字符串,常用语网络数据传输)
  1. # Python中的数据类型的格式
  2. data = [
  3.     {"id": 1, "name": "武沛齐", "age": 18},
  4.     {"id": 2, "name": "alex", "age": 18},
  5.     ('wupeiqi',123),
  6. ]
  7. # JSON格式
  8. value = '[{"id": 1, "name": "武沛齐", "age": 18}, {"id": 2, "name": "alex", "age": 18},["wupeiqi",123]]'
复制代码
1.1.1 核心功能

json格式的作用?
  1. 跨语言数据传输,例如:
  2.         A系统用Python开发,有列表类型和字典类型等。
  3.         B系统用Java开发,有数组、map等的类型。
  4.         语言不同,基础数据类型格式都不同。
  5.        
  6.         为了方便数据传输,大家约定一个格式:json格式,每种语言都是将自己数据类型转换为json格式,也可以将json格式的数据转换为自己的数据类型。
复制代码

Python数据类型与json格式的相互转换:

  • 数据类型 -> json ,一般称为:序列化
    1. import json
    2. data = [
    3.     {"id": 1, "name": "武沛齐", "age": 18},
    4.     {"id": 2, "name": "alex", "age": 18},
    5. ]
    6. res = json.dumps(data)
    7. print(res) # '[{"id": 1, "name": "\u6b66\u6c9b\u9f50", "age": 18}, {"id": 2, "name": "alex", "age": 18}]'
    8. res = json.dumps(data, ensure_ascii=False)
    9. print(res) # '[{"id": 1, "name": "武沛齐", "age": 18}, {"id": 2, "name": "alex", "age": 18}]'
    复制代码
  • json格式 -> 数据类型,一般称为:反序列化
    1. import json
    2. data_string = '[{"id": 1, "name": "武沛齐", "age": 18}, {"id": 2, "name": "alex", "age": 18}]'
    3. data_list = json.loads(data_string)
    4. print(data_list)
    复制代码
练习题


  • 写网站,给用户返回json格式数据

    • 安装flask模块,协助我们快速写网站(之前已安装过)
      1. pip3 install flask
      复制代码
    • 使用flask写网站
      1. import json
      2. from flask import Flask
      3. app = Flask(__name__)
      4. def index():
      5.     return "首页"
      6. def users():
      7.     data = [
      8.         {"id": 1, "name": "武沛齐", "age": 18},
      9.         {"id": 2, "name": "alex", "age": 18},
      10.     ]
      11.     return json.dumps(data)
      12. app.add_url_rule('/index/', view_func=index, endpoint='index')
      13. app.add_url_rule('/users/', view_func=users, endpoint='users')
      14. if __name__ == '__main__':
      15.     app.run()
      复制代码

  • 发送网络请求,获取json格式数据并处理。
    1. import json
    2. import requests
    3. url = "https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=5&page_start=20"
    4. res = requests.get(
    5.     url=url,
    6.     headers={
    7.         "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
    8.     }
    9. )
    10. # json格式
    11. print(res.text)
    12. # json格式转换为python数据类型
    13. data_dict = json.loads(res.text)
    14. print(data_dict)
    复制代码
1.1.2 类型要求

python的数据类型转换为 json 格式,对数据类型是有要求的,默认只支持:
  1.     +-------------------+---------------+
  2.     | Python            | JSON          |
  3.     +===================+===============+
  4.     | dict              | object        |
  5.     +-------------------+---------------+
  6.     | list, tuple       | array         |
  7.     +-------------------+---------------+
  8.     | str               | string        |
  9.     +-------------------+---------------+
  10.     | int, float        | number        |
  11.     +-------------------+---------------+
  12.     | True              | true          |
  13.     +-------------------+---------------+
  14.     | False             | false         |
  15.     +-------------------+---------------+
  16.     | None              | null          |
  17.     +-------------------+---------------+
复制代码
  1. data = [
  2.     {"id": 1, "name": "武沛齐", "age": 18},
  3.     {"id": 2, "name": "alex", "age": 18},
  4. ]
复制代码
其他类型如果想要支持,需要自定义JSONEncoder 才能实现【目前只需要了解大概意思即可,以后项目开发中用到了还会讲解。】,例如:
  1. import json
  2. from decimal import Decimal
  3. from datetime import datetime
  4. data = [
  5.     {"id": 1, "name": "武沛齐", "age": 18, 'size': Decimal("18.99"), 'ctime': datetime.now()},
  6.     {"id": 2, "name": "alex", "age": 18, 'size': Decimal("9.99"), 'ctime': datetime.now()},
  7. ]
  8. class MyJSONEncoder(json.JSONEncoder):
  9.     def default(self, o):
  10.         if type(o) == Decimal:
  11.             return str(o)
  12.         elif type(o) == datetime:
  13.             return o.strftime("%Y-%m-%d")
  14.         return super().default(o)
  15. res = json.dumps(data, cls=MyJSONEncoder)
  16. print(res)
复制代码
1.1.3 其他功能

json模块中常用的是:

  • json.dumps,序列化生成一个字符串。
  • json.loads,反序列化生成python数据类型。
  • json.dump,将数据序列化并写入文件(不常用)
    1. import jsondata = [
    2.     {"id": 1, "name": "武沛齐", "age": 18},
    3.     {"id": 2, "name": "alex", "age": 18},
    4. ]file_object = open('xxx.json', mode='w', encoding='utf-8')json.dump(data, file_object)file_object.close()
    复制代码
  • json.load,读取文件中的数据并反序列化为python的数据类型(不常用)
    1. import json
    2. file_object = open('xxx.json', mode='r', encoding='utf-8')
    3. data = json.load(file_object)
    4. print(data)
    5. file_object.close()
    复制代码
1.2 时间处理


  • UTC/GMT:世界时间
  • 本地时间:本地时区的时间。
Python中关于时间处理的模块有两个,分别是time和datetime。
1.2.1 time
  1. import time
  2. # 获取当前时间戳(自1970-1-1 00:00)
  3. v1 = time.time()
  4. print(v1)
  5. # 时区
  6. v2 = time.timezone
  7. # 停止n秒,再执行后续的代码。
  8. time.sleep(5)
复制代码
1.2.2 datetime

在平时开发过程中的时间一般是以为如下三种格式存在:

  • datetime
    1. from datetime import datetime, timezone, timedelta
    2. v1 = datetime.now()  # 当前本地时间
    3. print(v1)
    4. tz = timezone(timedelta(hours=7))  # 当前东7区时间
    5. v2 = datetime.now(tz)
    6. print(v2)
    7. v3 = datetime.utcnow()  # 当前UTC时间
    8. print(v3)
    复制代码
    1. from datetime import datetime, timedelta
    2. v1 = datetime.now()
    3. print(v1)
    4. # 时间的加减
    5. v2 = v1 + timedelta(days=140, minutes=5)
    6. print(v2)
    7. # datetime类型 + timedelta类型
    复制代码
    1. from datetime import datetime, timezone, timedelta
    2. v1 = datetime.now()
    3. print(v1)
    4. v2 = datetime.utcnow()  # 当前UTC时间
    5. print(v2)
    6. # datetime之间相减,计算间隔时间(不能相加)
    7. data = v1 - v2
    8. print(data.days, data.seconds / 60 / 60, data.microseconds)
    9. # datetime类型 - datetime类型
    10. # datetime类型 比较 datetime类型
    复制代码
  • 字符串
    1. # 字符串格式的时间  ---> 转换为datetime格式时间
    2. text = "2021-11-11"
    3. v1 = datetime.strptime(text,'%Y-%m-%d') # %Y 年,%m,月份,%d,天。
    4. print(v1)
    复制代码
    1. # datetime格式 ----> 转换为字符串格式
    2. v1 = datetime.now()
    3. val = v1.strftime("%Y-%m-%d %H:%M:%S")
    4. print(val)
    复制代码
  • 时间戳
    1. # 时间戳格式 --> 转换为datetime格式
    2. ctime = time.time() # 11213245345.123
    3. v1 = datetime.fromtimestamp(ctime)
    4. print(v1)
    复制代码
    1. # datetime格式 ---> 转换为时间戳格式
    2. v1 = datetime.now()
    3. val = v1.timestamp()
    4. print(val)
    复制代码

练习题


  • 日志记录,将用户输入的信息写入到文件,文件名格式为年-月-日-时-分.txt。
    1. from datetime import datetime
    2. while True:
    3.     text = input("请输入内容:")
    4.     if text.upper() == "Q":
    5.         break
    6.     current_datetime = datetime.now().strftime("%Y-%m-%d-%H-%M")
    7.     file_name = "{}.txt".format(current_datetime)
    8.     with open(file_name, mode='a', encoding='utf-8') as file_object:
    9.         file_object.write(text)
    10.         file_object.flush()
    复制代码
  • 用户注册,将用户信息写入Excel,其中包含:用户名、密码、注册时间 三列。
    1. import os
    2. import hashlib
    3. from datetime import datetime
    4. from openpyxl import load_workbook
    5. from openpyxl import workbook
    6. BASE_DIR = os.path.dirname(os.path.abspath(__file__))
    7. FILE_NAME = "db.xlsx"
    8. def md5(origin):
    9.     hash_object = hashlib.md5("sdfsdfsdfsd23sd".encode('utf-8'))
    10.     hash_object.update(origin.encode('utf-8'))
    11.     return hash_object.hexdigest()
    12. def register(username, password):
    13.     db_file_path = os.path.join(BASE_DIR, FILE_NAME)
    14.     if os.path.exists(db_file_path):
    15.         wb = load_workbook(db_file_path)
    16.         sheet = wb.worksheets[0]
    17.         next_row_position = sheet.max_row + 1
    18.     else:
    19.         wb = workbook.Workbook()
    20.         sheet = wb.worksheets[0]
    21.         next_row_position = 1
    22.     user = sheet.cell(next_row_position, 1)
    23.     user.value = username
    24.     pwd = sheet.cell(next_row_position, 2)
    25.     pwd.value = md5(password)
    26.     ctime = sheet.cell(next_row_position, 3)
    27.     ctime.value = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    28.     wb.save(db_file_path)
    29. def run():
    30.     while True:
    31.         username = input("请输入用户名:")
    32.         if username.upper() == "Q":
    33.             break
    34.         password = input("请输入密码:")
    35.         register(username, password)
    36. if __name__ == '__main__':
    37.     run()
    复制代码
1.3 正则表达式相关

当给你一大堆文本信息,让你提取其中的指定数据时,可以使用正则来实现。例如:提取文本中的邮箱和手机号
  1. import re
  2. text = "楼主太牛逼了,在线想要 442662578@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀"
  3. phone_list = re.findall("1[3|5|8|9]\d{9}", text)
  4. print(phone_list)
复制代码
1.3.1 正则表达式

1. 字符相关


  • wupeiqi 匹配文本中的wupeiqi
    1. import re
    2. text = "你好wupeiqi,阿斯顿发wupeiqasd 阿士大夫能接受的wupeiqiff"
    3. data_list = re.findall("wupeiqi", text)
    4. print(data_list) # ['wupeiqi', 'wupeiqi'] 可用于计算字符串中某个字符出现的次数
    复制代码
  • [abc] 匹配a或b或c字符。
    1. import re
    2. text = "你2b好wupeiqi,阿斯顿发awupeiqasd 阿士大夫a能接受的wffbbupqaceiqiff"
    3. data_list = re.findall("[abc]", text)
    4. print(data_list) # ['b', 'a', 'a', 'a', 'b', 'b', 'a', 'c']
    复制代码
    1. import re
    2. text = "你2b好wupeiqi,阿斯顿发awupeiqasd 阿士大夫a能接受的wffbbupqcceiqiff"
    3. data_list = re.findall("q[abc]", text)
    4. print(data_list) # ['qa', 'qc']
    复制代码
  • [^abc] 匹配除了abc以外的其他字符。
    1. import re
    2. text = "你wffbbupceiqiff"
    3. data_list = re.findall("[^abc]", text)
    4. print(data_list)  # ['你', 'w', 'f', 'f', 'u', 'p', 'e', 'i', 'q', 'i', 'f', 'f']
    复制代码
  • [a-z]  匹配a~z的任意字符( [0-9]也可以 )。
    1. import re
    2. text = "alexrootrootadmin"
    3. data_list = re.findall("t[a-z]", text)
    4. print(data_list)  # ['tr', 'ta']
    复制代码
  • .  代指除换行符以外的任意字符。
    1. import re
    2. text = "alexraotrootadmin"
    3. data_list = re.findall("r.o", text)
    4. print(data_list) # ['rao', 'roo']
    复制代码
    1. import re
    2. text = "alexraotrootadmin"
    3. data_list = re.findall("r.+o", text) # 贪婪匹配
    4. print(data_list) # ['raotroo']
    复制代码
    1. import re
    2. text = "alexraotrootadmin"
    3. data_list = re.findall("r.+?o", text) # 非贪婪匹配
    4. print(data_list) # ['rao']
    复制代码
  • \w 代指字母或数字或下划线(汉字)。
    1. import re
    2. text = "北京武沛alex齐北  京武沛alex齐"
    3. data_list = re.findall("武\w+x", text)
    4. print(data_list) # ['武沛alex', '武沛alex']
    复制代码
  • \d 代指数字
    1. import re
    2. text = "root-ad32min-add3-admd1in"
    3. data_list = re.findall("d\d", text)
    4. print(data_list) # ['d3', 'd3', 'd1']
    复制代码
    1. import re
    2. text = "root-ad32min-add3-admd1in"
    3. data_list = re.findall("d\d+", text)
    4. print(data_list) # ['d32', 'd3', 'd1']
    复制代码
  • \s 代指任意的空白符,包括空格、制表符等。
    1. import re
    2. text = "root admin add admin"
    3. data_list = re.findall("a\w+\s\w+", text)
    4. print(data_list) # ['admin add']
    复制代码
2. 数量相关


  • * 重复0次或更多次
    1. import re
    2. text = "他是大B个,确实是个大2B。"
    3. data_list = re.findall("大2*B", text)
    4. print(data_list) # ['大B', '大2B']
    复制代码
  • + 重复1次或更多次
    1. import re
    2. text = "他是大B个,确实是个大2B,大3B,大66666B。"
    3. data_list = re.findall("大\d+B", text)
    4. print(data_list) # ['大2B', '大3B', '大66666B']
    复制代码
  • ? 重复0次或1次
    1. import re
    2. text = "他是大B个,确实是个大2B,大3B,大66666B。"
    3. data_list = re.findall("大\d?B", text)
    4. print(data_list) # ['大B', '大2B', '大3B']
    复制代码
  • {n} 重复n次
    1. import re
    2. text = "楼主太牛逼了,在线想要 442662578@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀"
    3. data_list = re.findall("151312\d{5}", text)
    4. print(data_list) # ['15131255789']
    复制代码
  • {n,} 重复n次或更多次
    1. import re
    2. text = "楼主太牛逼了,在线想要 442662578@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀"
    3. data_list = re.findall("\d{9,}", text)
    4. print(data_list) # ['442662578', '15131255789']
    复制代码
  • {n,m} 重复n到m次
    1. import re
    2. text = "楼主太牛逼了,在线想要 442662578@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀"
    3. data_list = re.findall("\d{10,15}", text)
    4. print(data_list) # ['15131255789']
    复制代码
3. 括号(分组)


  • 提取数据区域
    1. import re
    2. text = "楼主太牛逼了,在线想要 442662578@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀"
    3. data_list = re.findall("15131(2\d{5})", text)
    4. print(data_list)  # ['255789']
    复制代码
    1. import re
    2. text = "楼主太牛逼了,在线想要 442662578@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来15131266666呀"
    3. data_list = re.findall("15(13)1(2\d{5})", text)
    4. print(data_list)  # [ ('13', '255789')   ]
    复制代码
    1. import re
    2. text = "楼主太牛逼了,在线想要 442662578@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀"
    3. data_list = re.findall("(15131(2\d{5}))", text)
    4. print(data_list)  # [('15131255789', '255789')]
    复制代码
  • 获取指定区域 + 或条件
    1. import re
    2. text = "楼主15131root太牛15131alex逼了,在线想要 442662578@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀"
    3. data_list = re.findall("15131(2\d{5}|r\w+太)", text)
    4. print(data_list)  # ['root太', '255789']
    复制代码
    1. import re
    2. text = "楼主15131root太牛15131alex逼了,在线想要 442662578@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀"
    3. data_list = re.findall("(15131(2\d{5}|r\w+太))", text)
    4. print(data_list)  # [('15131root太', 'root太'), ('15131255789', '255789')]
    复制代码
    练习题

  • 利用正则匹配QQ号码
    1. [1-9]\d{4,}
    复制代码
  • 身份证号码
    1. import re
    2. text = "dsf130429191912015219k13042919591219521Xkk"
    3. data_list = re.findall("\d{17}[\dX]", text) # [abc]
    4. print(data_list) # ['130429191912015219', '13042919591219521X']
    复制代码
    1. import re
    2. text = "dsf130429191912015219k13042919591219521Xkk"
    3. data_list = re.findall("\d{17}(\d|X)", text)
    4. print(data_list) # ['9', 'X']
    复制代码
    1. import re
    2. text = "dsf130429191912015219k13042919591219521Xkk"
    3. data_list = re.findall("(\d{17}(\d|X))", text)
    4. print(data_list) # [('130429191912015219', '9'), ('13042919591219521X', 'X')]
    复制代码
    1. import re
    2. text = "dsf130429191912015219k13042919591219521Xkk"
    3. data_list = re.findall("(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)", text)
    4. print(data_list) # [('130429', '1919', '12', '01', '521', '9'), ('130429', '1959', '12', '19', '521', 'X')]
    复制代码
  • 手机号
    1. import re
    2. text = "我的手机号是15133377892,你的手机号是1171123啊?"
    3. data_list = re.findall("1[3-9]\d{9}", text)
    4. print(data_list)  # ['15133377892']
    复制代码
  • 邮箱地址
    1. import re
    2. text = "楼主太牛逼了,在线想要 442662578@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀"
    3. email_list = re.findall("\w+@\w+\.\w+",text)
    4. print(email_list) # ['442662578@qq.com和xxxxx']
    复制代码
    1. import re
    2. text = "楼主太牛逼了,在线想要 442662578@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀"
    3. email_list = re.findall("[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+", text, re.ASCII)
    4. print(email_list) # ['442662578@qq.com', 'xxxxx@live.com']
    复制代码
    1. import re
    2. text = "楼主太牛逼了,在线想要 442662578@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀"
    3. email_list = re.findall("\w+@\w+\.\w+", text, re.ASCII)        # 加入re.ASCII就不会匹配中文了
    4. print(email_list) # ['442662578@qq.com', 'xxxxx@live.com']
    复制代码
    1. import re
    2. text = "楼主太牛44266-2578@qq.com逼了,在线想要 442662578@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀"
    3. email_list = re.findall("(\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)", text, re.ASCII)
    4. print(email_list) # [('44266-2578@qq.com', '-2578', '', ''), ('xxxxx@live.com', '', '', '')]
    复制代码
  • 补充代码,实现获取页面上的所有评论,并提取里面的邮箱。
    1. # 先安装两个模块
    2. pip3 install requests
    3. pip3 install beautifulsoup4
    复制代码
    1. import re
    2. import requests
    3. from bs4 import BeautifulSoup
    4. res = requests.get(url="https://www.douban.com/group/topic/296008426", headers={
    5. 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36', })
    6. bs_object = BeautifulSoup(res.text, "html.parser")
    7. comment_object_list = bs_object.find_all("p", attrs={"class": "reply-content"})
    8. for comment_object in comment_object_list:
    9.     text = comment_object.text
    10.     print(text)
    11.     email_list = re.findall("\w+@\w+\.\w+", text, re.ASCII)
    12.     if email_list:
    13.         for email in email_list:
    14.             print(email)
    复制代码
4. 起始和结束

上述示例中都是去一段文本中提取数据,只要文本中存在即可。
但,如果要求用户输入的内容必须是指定的内容开头和结尾,比就需要用到如下两个字符。

  • ^ 开始
  • $ 结束
  1. import re
  2. text = "啊442662578@qq.com我靠"
  3. email_list = re.findall("^\w+@\w+.\w+$", text, re.ASCII)
  4. print(email_list) # []
复制代码
  1. import re
  2. text = "442662578@qq.com"
  3. email_list = re.findall("^\w+@\w+.\w+$", text, re.ASCII)
  4. print(email_list) # ['442662578@qq.com']
复制代码
这种一般用于对用户输入数据格式的校验比较多,例如:
  1. import re
  2. text = input("请输入邮箱:")
  3. email = re.findall("^\w+@\w+.\w+$", text, re.ASCII)
  4. if not email:
  5.     print("邮箱格式错误")
  6. else:
  7.     print(email)
复制代码
5. 特殊字符

由于正则表达式中 *  .  \ { } ( )  等都具有特殊的含义,所以如果想要在正则中匹配这种指定的字符,需要转义,例如:
  1. import re
  2. text = "我是你{5}爸爸"
  3. data = re.findall("你{5}爸", text)
  4. print(data) # []
复制代码
  1. import re
  2. text = "我是你{5}爸爸"
  3. data = re.findall("你\{5\}爸", text)
  4. print(data)     # ['你{5}爸']
复制代码
1.3.2 re模块

python中提供了re模块,可以处理正则表达式并对文本进行处理。

  • findall,获取匹配到的所有数据
    1. import re
    2. text = "dsf130429191912015219k13042919591219521Xkk"
    3. data_list = re.findall("(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)", text)
    4. print(data_list) # [('130429', '1919', '12', '01', '521', '9'), ('130429', '1959', '12', '19', '521', 'X')]
    复制代码
  • match,从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None
    1. import re
    2. text = "大小逗2B最逗3B欢乐"
    3. data = re.match("逗\dB", text)
    4. print(data) # None
    复制代码
    1. import re
    2. text = "逗2B最逗3B欢乐"
    3. data = re.match("逗\dB", text)
    4. if data:
    5.     content = data.group() # "逗2B"
    6.     print(content)
    复制代码
  • search,浏览整个字符串去匹配第一个,未匹配成功返回None
    1. import re
    2. text = "大小逗2B最逗3B欢乐"
    3. data = re.search("逗\dB", text)
    4. if data:
    5.     print(data.group())  # "逗2B"
    复制代码
  • sub,替换匹配成功的位置
    1. import re
    2. text = "逗2B最逗3B欢乐"
    3. data = re.sub("\dB", "沙雕", text)
    4. print(data) # 逗沙雕最逗沙雕欢乐
    复制代码
    1. import re
    2. text = "逗2B最逗3B欢乐"
    3. data = re.sub("\dB", "沙雕", text, 1)        # 从左到右匹配,只替换1次
    4. print(data) # 逗沙雕最逗3B欢乐
    复制代码
  • split,根据匹配成功的位置分割
    1. import re
    2. text = "逗2B最逗3B欢乐"
    3. data = re.split("\dB", text)
    4. print(data) # ['逗', '最逗', '欢乐']
    复制代码
    1. import re
    2. text = "逗2B最逗3B欢乐"
    3. data = re.split("\dB", text, 1)
    4. print(data) # ['逗', '最逗3B欢乐']
    复制代码
  • finditer
    1. import re
    2. text = "逗2B最逗3B欢乐"
    3. data = re.finditer("\dB", text)
    4. for item in data:
    5.     print(item.group())
    复制代码
    1. import re
    2. text = "逗2B最逗3B欢乐"
    3. data = re.finditer("(?P<xx>\dB)", text)  # 命名分组
    4. for item in data:
    5.     print(item.groupdict())
    复制代码
    1. text = "dsf130429191912015219k13042919591219521Xkk"
    2. data_list = re.finditer("\d{6}(?P<year>\d{4})(?P<month>\d{2})(?P<day>\d{2})\d{3}[\d|X]", text)
    3. for item in data_list:
    4.     info_dict = item.groupdict()
    5.     print(info_dict)
    复制代码
小结

到此,关于最常见的内置模块就全部讲完了(共11个),现阶段只需要掌握这些模块的使用即可,在后续的课程和练习题中也会涉及到一些其他内置模块。

  • os
  • shutil
  • sys
  • random
  • hashlib
  • configparser
  • xml
  • json
  • time
  • datetime
  • re
2. 项目开发规范

现阶段,我们在开发一些程序时(终端运行),应该遵循一些结构的规范,让你的系统更加专业。
2.1 单文件应用

当基于python开发简单应用时(一个py文件就能搞定),需要注意如下几点。
  1. """
  2. 文件注释
  3. """
  4. import re
  5. import random
  6. import requests
  7. from openpyxl import load_workbook
  8. DB = "XXX"
  9. def do_something():
  10.     """ 函数注释 """
  11.     # TODO 待完成时,下一期实现xxx功能
  12.     for i in range(10):
  13.         pass
  14. def run():
  15.     """ 函数注释 """
  16.     # 对功能代码进行注释
  17.     text = input(">>>")
  18.     print(text)
  19. if __name__ == '__main__':
  20.     run()
复制代码

2.2 单可执行文件

新创建一个项目,假设名字叫 【crm】,可以创建如下文件和文件夹来存放代码和数据。
  1. crm
  2. ├── app.py        文件,程序的主文件(尽量精简)
  3. ├── config.py     文件,配置文件(放相关配置信息,代码中读取配置信息,如果想要修改配置,即可以在此修改,不用再去代码中逐一修改了)
  4. ├── db            文件夹,存放数据
  5. ├── files         文件夹,存放文件
  6. ├── src           包,业务处理的代码
  7. └── utils         包,公共功能
复制代码

2.3 多可执行文件

新创建项目,假设名称叫【killer】,可以创建如下文件和文件夹来存放代码和数据。
  1. killer
  2. ├── bin                                        文件夹,存放多个主文件(可运行)
  3. │   ├── app1.py
  4. │   └── app2.py
  5. ├── config              包,配置文件
  6. │   ├── __init__.py
  7. │   └── settings.py
  8. ├── db                  文件夹,存放数据
  9. ├── files               文件夹,存放文件
  10. ├── src                 包,业务代码
  11. │   └── __init__.py
  12. └── utils               包,公共功能
  13.     └── __init__.py
复制代码

总结


  • json格式和json模块
  • json模块处理特殊的数据类型
  • datetime格式与字符串、时间戳以及相关之间的转换。
  • datetime格式时间与timedelta的加减。
  • 两个datetime相减可以计算时间间隔,得到的是一个timedelta格式的时间。
  • 了解正则表达式的编写方式和python中re模块的使用。
  • 项目开发规范。
作业:开发短视频资讯平台


  • 有video.csv视频库文件,其中有999条短视频数据,格式如下:【 video.csv 文件已为大家提供好,在day15课件目录下。 】

  • 项目的核心功能有:

    • 分页看新闻(每页显示10条),提示用户输入页码,根据页码显示指定页面的数据。

      • 提示用户输入页码,根据页码显示指定页面的数据。
      • 当用户输入的页码不存在时,默认显示第1页

    • 搜索专区

      • 用户输入关键字,根据关键词筛选出所有匹配成功的短视频资讯。
      • 支持的搜索两种搜索格式:

        • id=1715025,筛选出id等于1715025的视频(video.csv的第一列)。
        • key=文本,模糊搜索,筛选包含关键字的所有新闻(video.csv的第二列)。


    • 下载专区

      • 用户输入视频id,根据id找到对应的mp4视频下载地址,然后下载视频到项目的files目录。

        • 视频的文件名为:视频id-年-月-日-时-分-秒.mp4
        • 视频下载代码示例
          1. import requests
          2. res = requests.get(
          3.     url='https://video.pearvideo.com/mp4/adshort/20210105/cont-1715046-15562045_adpkg-ad_hd.mp4'
          4. )
          5. # 视频总大小(字节)
          6. file_size = int(res.headers['Content-Length'])
          7. download_size = 0
          8. with open('xxx.mp4', mode='wb') as file_object:
          9.     # 分块读取下载的视频文件(最多一次读128字节),并逐一写入到文件中。 len(chunk)表示实际读取到每块的视频文件大小。
          10.     for chunk in res.iter_content(128):
          11.         download_size += len(chunk)
          12.         file_object.write(chunk)
          13.         file_object.flush()
          14.         message = "视频总大小为:{}字节,已下载{}字节。".format(file_size, download_size)
          15.         print(message)
          16.     file_object.close()
          17. res.close()
          复制代码
        • 下载的过程中,输出已下载的百分比,示例代码如下:
          1. import time
          2. print("正在下载中...")
          3. for i in range(101):
          4.     text = "\r{}%".format(i)
          5.     print(text, end="")
          6.     time.sleep(0.2)
          7. print("\n下载完成")
          复制代码


    参考代码链接:短视频资讯平台


来源:https://www.cnblogs.com/sbhglqy/p/18118679
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
来自手机

举报 回复 使用道具