取自基础教程的章节标题,这些功能确实是很实用的,使用频率非常高。但在内容上,作了相对具象化的处理,同时在 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 sys
def test(param):
print(param)
if __name__ == '__main__':
test(sys.argv[1])
# 在交互/CLI模式下运行形如
# python test.py hello
os
os 包
import os
def 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 os
def 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 e
try:
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:
raise
def 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/' + i
if os.path.exists(des_path):
os.remove(des_path)
with open(des_path, 'wb+') as d:
d.writelines(f.readlines())
except Exception:
raise
if __name__ == '__main__':
test_text_file()
text_bin_file()
序列化与反序列化
pickle、shelve、json 包 序列化: dump() \ dumps() 反序列化:load() \ loads()
- 什么是序列化、反序列化
- 序列化的作用是什么
HTTP 网络请求
简单示例
requests 包、file 对象
GET
import requests
url = '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 json
import requests
url = '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-8
import random
class Choice:
def __init__(self):
pass
@staticmethod
def 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 + itr
print('生成的手机号为:%s' % (self.__first + self.__second + suffix))
return self.__first + self.__second + suffix
if __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, timedelta
def 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))
break
print('结束轮询')
return
def polling_optimizely(timeout=3):
"""timeout (秒)时间内,每间隔0.5s执行一次动作"""
start = datetime.now()
current = datetime.now()
_interval = 0.5
end = start + timedelta(seconds=+timeout)
while 1:
print("%s 时间,执行动作....." % current)
if current < end:
current += timedelta(seconds=_interval)
else:
print("动作执行...{timeout}s 超时结束".format(timeout=timeout))
break
print('结束轮询')
return
polling()
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, date
def 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 logging
logging.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 logging
logging.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()