欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python基础-2

程序员文章站 2022-06-17 11:26:49
1.文件操作 mode的常用种类r w a rb wb ab ,带b标识不用指定编码格式全都是byte类型 ,用于非文本文件(图 音 视频) r模式下仅读取 w模式下当文件没有可以创建 ,但是会覆盖写入 a模式下可以追加 2.三种推导式 推导式是可以从一个数据序列构建另一个新的数据序列的结构体(三种 ......

1.文件操作

  mode的常用种类r w a rb wb ab ,带b标识不用指定编码格式全都是byte类型 ,用于非文本文件(图 音 视频)  

  r模式下仅读取

  w模式下当文件没有可以创建 ,但是会覆盖写入

  a模式下可以追加

# 文件读取
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当前绝对路径

    sys模块

import sys

print(sys.modules)       #查看解释器运行时自动加载的所有模块
print(sys.path)            #查看第三方模块的路径 ,该路径下的模块都可以使用import导入使用,也可以使用sys.path.append()追加路径

    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