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

 

posted @ 2019-07-13 15:02  屈冠文  阅读(305)  评论(0编辑  收藏  举报