取自基础教程的章节标题,这些功能确实是很实用的,使用频率非常高。但在内容上,作了相对具象化的处理,同时在 I/O流处理、网络处理只可能是十分具体的,所以部分不多举例。 阅读源码或者其中的文档说明,能很好的帮助记忆与理解其用途等。无论如何,编程语言作为一类工具,根本上最需要的是实操
sys
https://docs.python.org/3/tutorial/interpreter.html#argument-passing https://docs.python.org/3/tutorial/modules.html#standard-modules
# 核验环境是否异常(比如本地如果安装有anaconda,会导致运行时异常)print(sys.path)# 将运行时环境加入系统,避免找不到依赖模块project_abspath = os.path.split(os.path.abspath(os.path.dirname(os.path.abspath(os.path.dirname(__file__)))))[0]print("工程所属路径:%s" % project_abspath)current_abspath = os.path.abspath(os.path.dirname(__file__))print("入口文件所在的绝对路径为:%s" % current_abspath)sys.path.append(project_abspath)sys.path.append(current_abspath)
在交互模式下作为脚本接收传参
import sysdef test(param):print(param)if __name__ == '__main__':test(sys.argv[1])# 在交互/CLI模式下运行形如# python test.py hello
os
os 包
import osdef test():# 获取当前目录的绝对路径print("获取当前调用命令时,目录的绝对路径" + os.getcwd())# 获取用户家目录print("获取的用户家目录:" + os.environ['HOME'])print("获取的用户家目录:" + os.path.expandvars('$HOME'))# print("获取的用户家目录:" + os.path.expanduser('~')) # 不推荐这个方法dir_name = '0001A'try:os.chdir('../../Desktop/')print("根据所在目录,切换到目标目录地址。现在所在路径:" + os.getcwd())os.mkdir(dir_name)print("所在路径的文件夹`%s`创建了" % dir_name)except FileExistsError:os.rmdir(dir_name)print("所在路径的指定文件`%s`被删除了" % dir_name)if __name__ == '__main__':test()
I/O与流解析
file 对象
import osdef test_text_file():try:os.chdir(os.environ['HOME'] + '/Desktop/0001A')# 以追加模式写文本文件for i in range(2):with open('h.txt', 'a+') as f:f.write('12345678')except (IOError, Exception):raise Exception("错误❌")try:os.chdir(os.environ['HOME'] + '/Desktop/0001A')# 以擦除模式写文本文件for i in range(2):with open('L.txt', 'w+') as f:f.write('87654321')except Exception as e:raise etry:os.chdir(os.environ['HOME'] + '/Desktop/0001A')# 读取文本文件的内容with open('h.txt', 'r+') as f1:print(f1.readline())with open('L.txt', 'r+') as f2:print(f2.readline())except Exception:raisedef text_bin_file():# 二进制文件。这里以 JPG 为例,将源文件拷贝到指定目录# 读取二进制文件try:os.chdir(os.environ['HOME'] + '/Desktop/screenshot')file_list = os.listdir(os.environ['HOME'] + '/Desktop/screenshot')print("文件夹中的文件有 %d 个" % len(file_list))for i in file_list:print("文件名 %s" % i)with open(i, 'rb+') as f:# 将二进制文件写入(模拟复制粘贴)des_path = os.environ['HOME'] + '/Desktop/0001A/' + iif os.path.exists(des_path):os.remove(des_path)with open(des_path, 'wb+') as d:d.writelines(f.readlines())except Exception:raiseif __name__ == '__main__':test_text_file()text_bin_file()
序列化与反序列化
pickle、shelve、json 包 序列化: dump() \ dumps() 反序列化:load() \ loads()
- 什么是序列化、反序列化
- 序列化的作用是什么
HTTP 网络请求
简单示例
requests 包、file 对象
GET
import requestsurl = 'http://' + ""s_url = 'https://' + "host/api/v1/login"headers = {"content-type": "application/json;charset=UTF-8","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",}req_data = {}def t_get():response = requests.get(url, headers, req_data)print(response.content)
POST
import jsonimport requestsurl = 'http://' + "host/api/v1/login"s_url = 'https://' + "host/api/v1/login"headers = {"content-type": "application/json;charset=UTF-8","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",}payload = {"account": "123", "password": "456"}def t_post():# :param json: 参数会自动序列化参数response = requests.post(headers=headers, url=s_url, json=payload)print(response.content)if __name__ == '__main__':t_post()
下载图片
略
伪随机
random 包
#! /usr/bin/python# coding:utf-8import randomclass Choice:def __init__(self):pass@staticmethoddef make_choice():# 返回从0~1的随机实数c1 = random.random()print('返回从0~1的随机实数: %s' % c1)# 返回一个 a~b(含) 的随机实数c2 = random.uniform(1, 1000)print('返回一个 a~b(含) 的随机实数: %s' % c2)# 从range(start, stop, step) 中随机选择一个数c3 = random.randrange(1, 100, 2)print('从range(start, stop, step) 中随机选择一个数: %s' % c3)# 从序列 seq 中随机地选择一个元素seq = [2, 4, 6, 8]c4 = random.choice(seq)print('从序列 seq 中随机地选择一个元素: %s' % c4)# 从序列 seq 中随机地选择 n 个值不同的元素seq = [1, 3, 5, 7, 9]c5 = random.sample(seq, 3)print('从序列 seq 中随机地选择 n 个值不同的元素: %s' % c5)# 返回一个 a~b(含) 的整型随机数c6 = random.randint(0, 9)print('返回一个 a~b(含) 的整型随机数 : %s' % c6)class GenMobile:def __init__(self):# 因为在 python 中,字符串也是序列self.__first = '1'self.__second = random.choice('345789')self.__third = '0123456789'def generator(self):suffix = ''for i in range(len(self.__third)-1):itr = random.choice(self.__third)suffix = suffix + itrprint('生成的手机号为:%s' % (self.__first + self.__second + suffix))return self.__first + self.__second + suffixif __name__ == '__main__':Choice.make_choice()g = GenMobile()g.generator()
轮询实现
#!/usr/local/bin/py3# -*- coding:utf-8 -*-"""@Interpreter: Python3.9@File: polling@Description:@Author: hailong.chen@Date: 2022/1/18 14:24@ModifiedBy:"""from datetime import datetime, timedeltadef polling(timeout=3):"""timeout 时间内执行动作"""start = datetime.now()end = start + timedelta(seconds=+timeout)while 1:print("执行动作.....")current = datetime.now()print(current)if current >= end:print("动作执行...{timeout}s 超时结束".format(timeout=timeout))breakprint('结束轮询')returndef polling_optimizely(timeout=3):"""timeout (秒)时间内,每间隔0.5s执行一次动作"""start = datetime.now()current = datetime.now()_interval = 0.5end = start + timedelta(seconds=+timeout)while 1:print("%s 时间,执行动作....." % current)if current < end:current += timedelta(seconds=_interval)else:print("动作执行...{timeout}s 超时结束".format(timeout=timeout))breakprint('结束轮询')returnpolling()polling_optimizely()
正则表达式
re 包
贪婪模式、非贪婪模式、零宽断言等

>>> import re>>> re.match('\d+','123')<re.Match object; span=(0, 3), match='123'>>>> re.search('\d+','abc123def')<re.Match object; span=(3, 6), match='123'>>>> re.findall('\d+','abc123def')['123']>>> re.findall('\d*','abc123def')['', '', '', '123', '', '', '', '']
日期时间
datetime 包 之 datetime 、timedelta 、date 模块
from datetime import datetime, timedelta, datedef t_datetime():# 格式化日期与时间print(datetime.now())print(datetime.now().strftime("%s"))print(datetime.now().strftime("%c"))print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))print(datetime.now().strftime("%D %H:%M:%S"))print(datetime.now().strftime("%H:%M:%S"))print(datetime.now().date())print(datetime.now().day)print(datetime.now().hour)print(date.today())# 计算日期时间差now = datetime.now()past_date = now + timedelta(days=-41)print(past_date.strftime("%Y-%m-%d"))print(past_date.day)if __name__ == '__main__':t_datetime()
日志
logging
import logginglogging.basicConfig(level=logging.INFO,format='%(asctime)s - %(filename)s - %(funcName)s - LINE: %(lineno)s -%(levelname)s - %(message)s',encoding='utf-8')logger = logging.getLogger(__name__)# 测试代码def print_log():logger.info('错误')if __name__ == '__main__':print_log()
import logginglogging.basicConfig(level=logging.INFO,filename='./logs.logs',format='%(asctime)s - %(filename)s - %(funcName)s - LINE: %(lineno)s -%(levelname)s - %(message)s',encoding='utf-8')logger = logging.getLogger(__name__)# 测试代码def print_log():logger.info('错误')if __name__ == '__main__':print_log()
