python基础-2
1.文件操作
mode的常用种类r w a rb wb ab ,带b标识不用指定编码格式全都是byte类型 ,用于非文本文件(图 音 视频)
r模式下仅读取
w模式下当文件没有可以创建 ,但是会覆盖写入
a模式下可以追加
readline() 读取一行,不占用内存
readlines() 将文件所有行读取放入一个list中
# 文件读取
f = open('json.txt',mode='r',encoding="utf-8") # 读取文件编码
print(f.readline())
print(f.readline()) # 从文件中读取一行一行读取
print(f.read()) # 将管道文件内容一次读取出来
f.seek(0) # 移动光标 ,0到最开始位置 1光标当前位置 2文件尾部
print(f.read())
f.flush() # 清空管道
f.close() # 关闭管道
# 文件复制写入
with open('json.txt', mode='rb') as f1,open('copy.txt', mode='wb') as f2: # with可以帮助做管道优化
for line in f1: # for循环按文件行循环
f2.write(line)
# 文件修改(所有的编辑器都是如此)
# 文件修改的步骤: 1.文件修改仅将源文件读出 2.变更操作写入新文件 3.源文件删除 4.新文件重命名
import os
with open("test1.txt", mode="r", encoding="utf-8") as f1, \
open("test1.txt_副本", mode="w", encoding="utf-8") as f2:
# 代码块(with), 当这个代码块结束的时候. 自动的关闭f1和f2
for line in f1:
s = line.replace("centos", "redhat")
f2.write(s)
os.remove("test1.txt")
os.rename("test1.txt_副本", "test1.txt")
2.三种推导式
推导式是可以从一个数据序列构建另一个新的数据序列的结构体(三种:list dict set推导式)
list推导式 [表达式 for 循环 if 条件] #换成圆括号变生成器
#推导式
list1 = [x*x for x in range(1,10)]
#普通 list1=[] for x in range(1,10): list1.append(x*x)
dict推导式 {key:value for循环 if判断}
# 推导式
dict1 = {x:x**x for x in range(0, 10) if x < 9}
# 普通
dict3={}
for k in range(0,10):
if k < 9:
dict3[k]=k**k
# key values 互换
dict1 = {1: 'n1', 2: 'n2'}
dict2 = {v: k+1 for k, v in dict1.items()}
set推导式 {表达式 for 循环 if 条件} # 与列表推导式的扩号不同
set1 = {x**x:2 for x in range(0, 10) if x < 9}
3.闭包
闭包在python中 ,可以简单理解为 ,内函数绑定外函数的局部变量 ,外函数返回内函数内存地址
# 匿名函数的闭包写法
fun = [lambda x: x*i for i in range(4)] # 典型闭包 ,外函数的i最后会是3,内函数lambda从外函数没有定义i的值 ,最后生成列表都是函数
for item in fun:
print(item(1))
# def函数的闭包写法
def func():
# 定义一个空列表
fun_lambda_list = []
# 循环
for i in range(4):
# 定义一个内函数,没被调用也不会去拿i的值 ,所以返回值一直都是x*i
def lambda_(x):
# 返回x*i
return x * i
# 将内函数追加到列表中
fun_lambda_list.append(lambda_)
return fun_lambda_list #列表中有四个函数(一个都没有执行[x*i,x*i,x*i,x*i]) ,当fun被调用的那一刻开始i被定格为3
# 将内函数中加入每次i的值就可以了,这样获得的函数列表就是[x*0,x*1,x*2,x*3]
fun = [lambda x,i=i:x*i for i in range(4)]
4.模块-包
内置标准模块
random模块
import random
print(random.random()) # 随机0-1的浮点
print(random.uniform(1, 3)) # 随机1-3的浮点
print(random.randint(1, 10)) # 随机取1-10的整数
print(random.randrange(1, 9, 2)) # 随机取1-9之间的数步长为2,不顾尾
print(random.choice([1, 2, 3, [2, 3]])) # 随机选择可迭代对象元素
print(random.sample([1, 2, 3, 4, 'hh'], 3)) # 列表任意X个元素组成新列表,这里X是3
time模块
import time
print(time.localtime()) #打印当前日期
print(time.time()) #打印时间戳 19701.1. 00:00:00的偏移量
print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())) #格式化当前日期(format ,日期)
re模块
正则
# . 匹配任意单个字符
# ^ 匹配字符串起始部分
# $ 匹配字符串终止位置
# * 匹配前一个字符0或多次
# + 匹配前一个字符1次或多次
# ? 匹配前一个字符1次或0次
# {N} 匹配前一个字符N次
# {N,} 匹配前一个字符N次
# {M,N} 匹配前一个字符N,M次
# [...] 匹配任意字符集中单个字符
# [x-y] 匹配范围内任意单个字符
# [^..] 匹配出去字符集中任意单个字符
# \d 匹配任意一个10机制数字
# \w 匹配任意字母数字
# \s 匹配任何空字符
# \b 匹配字符边界
# () 分组 ,
# \N 匹配保存的分组
# \ 转义符
1.
2.
3.
4.
5.
re常用方法
re.match('正则表达式', 要匹配的字符串) #如果匹配成功返回一个对象 ,否则返回None
os模块
import os
os.path.abspath('..') # 获取父目录绝对路径
os.path.abspath('.') # 获取当前绝对路径
os.path.abspath(__file__) #获取当前文件的路径和文件名
dir1 = 'C:\\boruoboluomi\\a1\\b1\\a.txt'
os.path.dirname(os.path.dirname(os.path.abspath(dir1))) #dirname可以将路径 一层一层脱掉
os.path.split(dir1) # 切割路径 ,将路径与文件分离
os.path.join('C:\\boruoboluomi\\a1\\b1', 'a.txt') # 拼接路径 , 将路径与文件拼接
os.path.exists(dir1) # 判断该文件是否存在
os.remove('绝对路径文件') # 删除文件
os.system('ls /etc/profile') # 执行shell命令
os.getcwd() # 获取pwd当前绝对路径
os.path.getsize() #获取文件大小
sys模块
import sys
print(sys.modules) #查看解释器运行时自动加载的所有模块
print(sys.path) #查看第三方模块的路径 ,该路径下的模块都可以使用import导入使用,也可以使用sys.path.append()追加路径
print(sys.argv[1]) #拿出脚本的参数
math模块
import math
t1 = 6.6
print(math.ceil(t1)) # 向上取整
print(math.floor(t1)) # 向下取整
print(math.pow(t1, 2)) # t1的2次方
print(math.fabs(t1)) # t1的绝对值
json模块
序列化模块 ,json可以将python数据类型序列化为可传输的字符串 ,对方接受到后通过反序列化可获得自己可读语言数据类型
import json
#用于网络传输的dumps ,loads
dic = {'name':'小咪','age':12,'sex':'公'} #定义一个字典dic
ret = json.dumps(dic) #序列化过程:将dic变成json格式的ret(特殊字符串)
ret1 = json.loads(ret) #反序列化过程:将ret这个json格式反解成为ret1(还原为字典)
print(ret,type(ret))
print(ret1,type(ret1))
#用于文件存储数据的dump ,load
list1 = [1, 2, 3, 4]
f1 = open('json.txt', mode='w') # 打开一个文件,文件仅支持字符串写入
json.dump(list1, f1) # dump方法可以将py数据类型和文件句柄当做参数传入,做序列化
f1.close()
f1 = open('json.txt', mode='r')
ret = json.load(f1) # dump方法将文件中内容反序列化取出
print(ret, type(ret)) # 反序列化后数据类型和序列化之前一模一样
rsa模块 & base64模块
1.生成一组非对称秘钥对 ,该秘钥对最大加密数据长度是128字节 ,其中11个自己加密使用 ,被加密数据仅有117
2.base64编码的原因是因为网络传输错误会降低
3.定义加密函数 ,将数据以117步长切割加密 ,放入列表 ,发送到对端
4.定义解密函数 ,将数据以128步长解密拼接 ,即可获得原数据
5.调用rsa加密必须是byte的数据
import rsa
import base64
####生成一组秘钥对####
pub_key_obj, priv_key_obj = rsa.newkeys(1024) # 最大加密value的字节数是 1024/8 - 11(自己用) = 117(可用加密字节)
# 将对象转换为字符串类型
pub_key_str = pub_key_obj.save_pkcs1()
priv_key_str = priv_key_obj.save_pkcs1()
# 再通过base64编码
pub_key_code = base64.standard_b64encode(pub_key_str)
priv_key_code = base64.standard_b64encode(priv_key_str)
print(pub_key_code)
print(priv_key_code)
####数据加密####
def encrypt(bytes_value):
values_list = []
key_str = base64.standard_b64decode(pub_key_code)
pk = rsa.PublicKey.load_pkcs1(key_str)
length = len(bytes_value)
for i in range(0, length, 117):
val = rsa.encrypt(bytes_value[i: i + 117], pk)
values_list.append(val)
val = b''.join(values_list)
return val
####数据解密####
def decrypt(value):
values_list = []
key_str = base64.standard_b64decode(priv_key_code)
pk = rsa.PrivateKey.load_pkcs1(key_str)
length = len(value)
for i in range(0, length, 128):
val = rsa.decrypt(value[i: i + 128], pk)
values_list.append(val)
val = b''.join(values_list)
# val = rsa.decrypt(value, pk)
return val
###调用
string = 'alex' * 100
ret = encrypt(string.encode('utf-8')) # 加密数据要求byte类型
print(ret)
print(decrypt(ret).decode('utf-8')) # 数据encode编码->加密 ->解密->decode解码
自定义模块
自定义日志模块
1.__init__方法定义logger对象 ,定义info ,error方法 ,实例化Logger类获得单例模式的对象
2.使用直接from 文件 import logger 加载对象
3.调用 logger.info(日志即可)
import logging
from conf import settings
class Logger:
def __init__(self, file_name, log_name, level=logging.INFO):
# 定义使用文件介质存储(FileHandler) ,该文件名和编码格式
file_handler = logging.FileHandler(file_name, encoding='utf-8')
# 定义格式(Formatter)
fmt = logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s")
# 为文件介质定义格式(setFormatter)
file_handler.setFormatter(fmt)
# 定义logger对象,给实例化的对象 ,定义日志对象名与最低显示等级
self.logger = logging.Logger(log_name, level=level)
self.logger.addHandler(file_handler)
def info(self, msg):
return self.logger.info(msg)
def error(self, msg):
return self.logger.error(msg)
logger = Logger(settings.LOGGER_PATH, settings.LOGGER_NAME)
包
包就是有__init__.py文件标识的文件夹
精准导入方式
from lib.disk. import Pack1Class #推荐使用
import Root.Pack1.Pack1Class