取自基础教程的章节标题,这些功能确实是很实用的,使用频率非常高。但在内容上,作了相对具象化的处理,同时在 I/O流处理、网络处理只可能是十分具体的,所以部分不多举例。 阅读源码或者其中的文档说明,能很好的帮助记忆与理解其用途等。无论如何,编程语言作为一类工具,根本上最需要的是实操

sys

https://docs.python.org/3/tutorial/interpreter.html#argument-passing https://docs.python.org/3/tutorial/modules.html#standard-modules

  1. # 核验环境是否异常(比如本地如果安装有anaconda,会导致运行时异常)
  2. print(sys.path)
  3. # 将运行时环境加入系统,避免找不到依赖模块
  4. project_abspath = os.path.split(os.path.abspath(os.path.dirname(os.path.abspath(os.path.dirname(__file__)))))[0]
  5. print("工程所属路径:%s" % project_abspath)
  6. current_abspath = os.path.abspath(os.path.dirname(__file__))
  7. print("入口文件所在的绝对路径为:%s" % current_abspath)
  8. sys.path.append(project_abspath)
  9. sys.path.append(current_abspath)

在交互模式下作为脚本接收传参

  1. import sys
  2. def test(param):
  3. print(param)
  4. if __name__ == '__main__':
  5. test(sys.argv[1])
  6. # 在交互/CLI模式下运行形如
  7. # python test.py hello

os

os 包

  1. import os
  2. def test():
  3. # 获取当前目录的绝对路径
  4. print("获取当前调用命令时,目录的绝对路径" + os.getcwd())
  5. # 获取用户家目录
  6. print("获取的用户家目录:" + os.environ['HOME'])
  7. print("获取的用户家目录:" + os.path.expandvars('$HOME'))
  8. # print("获取的用户家目录:" + os.path.expanduser('~')) # 不推荐这个方法
  9. dir_name = '0001A'
  10. try:
  11. os.chdir('../../Desktop/')
  12. print("根据所在目录,切换到目标目录地址。现在所在路径:" + os.getcwd())
  13. os.mkdir(dir_name)
  14. print("所在路径的文件夹`%s`创建了" % dir_name)
  15. except FileExistsError:
  16. os.rmdir(dir_name)
  17. print("所在路径的指定文件`%s`被删除了" % dir_name)
  18. if __name__ == '__main__':
  19. test()

I/O与流解析

file 对象

  1. import os
  2. def test_text_file():
  3. try:
  4. os.chdir(os.environ['HOME'] + '/Desktop/0001A')
  5. # 以追加模式写文本文件
  6. for i in range(2):
  7. with open('h.txt', 'a+') as f:
  8. f.write('12345678')
  9. except (IOError, Exception):
  10. raise Exception("错误❌")
  11. try:
  12. os.chdir(os.environ['HOME'] + '/Desktop/0001A')
  13. # 以擦除模式写文本文件
  14. for i in range(2):
  15. with open('L.txt', 'w+') as f:
  16. f.write('87654321')
  17. except Exception as e:
  18. raise e
  19. try:
  20. os.chdir(os.environ['HOME'] + '/Desktop/0001A')
  21. # 读取文本文件的内容
  22. with open('h.txt', 'r+') as f1:
  23. print(f1.readline())
  24. with open('L.txt', 'r+') as f2:
  25. print(f2.readline())
  26. except Exception:
  27. raise
  28. def text_bin_file():
  29. # 二进制文件。这里以 JPG 为例,将源文件拷贝到指定目录
  30. # 读取二进制文件
  31. try:
  32. os.chdir(os.environ['HOME'] + '/Desktop/screenshot')
  33. file_list = os.listdir(os.environ['HOME'] + '/Desktop/screenshot')
  34. print("文件夹中的文件有 %d 个" % len(file_list))
  35. for i in file_list:
  36. print("文件名 %s" % i)
  37. with open(i, 'rb+') as f:
  38. # 将二进制文件写入(模拟复制粘贴)
  39. des_path = os.environ['HOME'] + '/Desktop/0001A/' + i
  40. if os.path.exists(des_path):
  41. os.remove(des_path)
  42. with open(des_path, 'wb+') as d:
  43. d.writelines(f.readlines())
  44. except Exception:
  45. raise
  46. if __name__ == '__main__':
  47. test_text_file()
  48. text_bin_file()

序列化与反序列化

pickleshelve、json 包 序列化: dump() \ dumps() 反序列化:load() \ loads()

  1. 什么是序列化、反序列化
  2. 序列化的作用是什么

HTTP 网络请求

简单示例

requests 包、file 对象

GET

  1. import requests
  2. url = 'http://' + ""
  3. s_url = 'https://' + "host/api/v1/login"
  4. headers = {
  5. "content-type": "application/json;charset=UTF-8",
  6. "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36",
  7. }
  8. req_data = {}
  9. def t_get():
  10. response = requests.get(url, headers, req_data)
  11. print(response.content)

POST

  1. import json
  2. import requests
  3. url = 'http://' + "host/api/v1/login"
  4. s_url = 'https://' + "host/api/v1/login"
  5. headers = {
  6. "content-type": "application/json;charset=UTF-8",
  7. "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36",
  8. }
  9. payload = {"account": "123", "password": "456"}
  10. def t_post():
  11. # :param json: 参数会自动序列化参数
  12. response = requests.post(headers=headers, url=s_url, json=payload)
  13. print(response.content)
  14. if __name__ == '__main__':
  15. t_post()

下载图片

伪随机

random 包

  1. #! /usr/bin/python
  2. # coding:utf-8
  3. import random
  4. class Choice:
  5. def __init__(self):
  6. pass
  7. @staticmethod
  8. def make_choice():
  9. # 返回从0~1的随机实数
  10. c1 = random.random()
  11. print('返回从0~1的随机实数: %s' % c1)
  12. # 返回一个 a~b(含) 的随机实数
  13. c2 = random.uniform(1, 1000)
  14. print('返回一个 a~b(含) 的随机实数: %s' % c2)
  15. # 从range(start, stop, step) 中随机选择一个数
  16. c3 = random.randrange(1, 100, 2)
  17. print('从range(start, stop, step) 中随机选择一个数: %s' % c3)
  18. # 从序列 seq 中随机地选择一个元素
  19. seq = [2, 4, 6, 8]
  20. c4 = random.choice(seq)
  21. print('从序列 seq 中随机地选择一个元素: %s' % c4)
  22. # 从序列 seq 中随机地选择 n 个值不同的元素
  23. seq = [1, 3, 5, 7, 9]
  24. c5 = random.sample(seq, 3)
  25. print('从序列 seq 中随机地选择 n 个值不同的元素: %s' % c5)
  26. # 返回一个 a~b(含) 的整型随机数
  27. c6 = random.randint(0, 9)
  28. print('返回一个 a~b(含) 的整型随机数 : %s' % c6)
  29. class GenMobile:
  30. def __init__(self):
  31. # 因为在 python 中,字符串也是序列
  32. self.__first = '1'
  33. self.__second = random.choice('345789')
  34. self.__third = '0123456789'
  35. def generator(self):
  36. suffix = ''
  37. for i in range(len(self.__third)-1):
  38. itr = random.choice(self.__third)
  39. suffix = suffix + itr
  40. print('生成的手机号为:%s' % (self.__first + self.__second + suffix))
  41. return self.__first + self.__second + suffix
  42. if __name__ == '__main__':
  43. Choice.make_choice()
  44. g = GenMobile()
  45. g.generator()

轮询实现

  1. #!/usr/local/bin/py3
  2. # -*- coding:utf-8 -*-
  3. """
  4. @Interpreter: Python3.9
  5. @File: polling
  6. @Description:
  7. @Author: hailong.chen
  8. @Date: 2022/1/18 14:24
  9. @ModifiedBy:
  10. """
  11. from datetime import datetime, timedelta
  12. def polling(timeout=3):
  13. """timeout 时间内执行动作"""
  14. start = datetime.now()
  15. end = start + timedelta(seconds=+timeout)
  16. while 1:
  17. print("执行动作.....")
  18. current = datetime.now()
  19. print(current)
  20. if current >= end:
  21. print("动作执行...{timeout}s 超时结束".format(timeout=timeout))
  22. break
  23. print('结束轮询')
  24. return
  25. def polling_optimizely(timeout=3):
  26. """timeout (秒)时间内,每间隔0.5s执行一次动作"""
  27. start = datetime.now()
  28. current = datetime.now()
  29. _interval = 0.5
  30. end = start + timedelta(seconds=+timeout)
  31. while 1:
  32. print("%s 时间,执行动作....." % current)
  33. if current < end:
  34. current += timedelta(seconds=_interval)
  35. else:
  36. print("动作执行...{timeout}s 超时结束".format(timeout=timeout))
  37. break
  38. print('结束轮询')
  39. return
  40. polling()
  41. polling_optimizely()

正则表达式

re 包

贪婪模式、非贪婪模式、零宽断言等
image.png
image.png

  1. >>> import re
  2. >>> re.match('\d+','123')
  3. <re.Match object; span=(0, 3), match='123'>
  4. >>> re.search('\d+','abc123def')
  5. <re.Match object; span=(3, 6), match='123'>
  6. >>> re.findall('\d+','abc123def')
  7. ['123']
  8. >>> re.findall('\d*','abc123def')
  9. ['', '', '', '123', '', '', '', '']

日期时间

datetime 包 之 datetime 、timedelta 、date 模块

  1. from datetime import datetime, timedelta, date
  2. def t_datetime():
  3. # 格式化日期与时间
  4. print(datetime.now())
  5. print(datetime.now().strftime("%s"))
  6. print(datetime.now().strftime("%c"))
  7. print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
  8. print(datetime.now().strftime("%D %H:%M:%S"))
  9. print(datetime.now().strftime("%H:%M:%S"))
  10. print(datetime.now().date())
  11. print(datetime.now().day)
  12. print(datetime.now().hour)
  13. print(date.today())
  14. # 计算日期时间差
  15. now = datetime.now()
  16. past_date = now + timedelta(days=-41)
  17. print(past_date.strftime("%Y-%m-%d"))
  18. print(past_date.day)
  19. if __name__ == '__main__':
  20. t_datetime()

日志

logging

  1. import logging
  2. logging.basicConfig(level=logging.INFO,
  3. format='%(asctime)s - %(filename)s - %(funcName)s - LINE: %(lineno)s -%(levelname)s - %(message)s',
  4. encoding='utf-8'
  5. )
  6. logger = logging.getLogger(__name__)
  7. # 测试代码
  8. def print_log():
  9. logger.info('错误')
  10. if __name__ == '__main__':
  11. print_log()
  1. import logging
  2. logging.basicConfig(level=logging.INFO,
  3. filename='./logs.logs',
  4. format='%(asctime)s - %(filename)s - %(funcName)s - LINE: %(lineno)s -%(levelname)s - %(message)s',
  5. encoding='utf-8'
  6. )
  7. logger = logging.getLogger(__name__)
  8. # 测试代码
  9. def print_log():
  10. logger.info('错误')
  11. if __name__ == '__main__':
  12. print_log()