zoukankan      html  css  js  c++  java
  • 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    匹配任何空字符
    #     匹配字符边界
    # ()   分组 ,
    # 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

  • 相关阅读:
    偶数求和
    POJ2002Squares
    学习笔记之ulimit
    LeetCode 345. Reverse Vowels of a String
    LeetCode 343. Integer Break
    LeetCode 292. Nim Game
    LeetCode 338. Counting Bits
    LeetCode 344. Reverse String
    [ZZ]良好的编码习惯
    学习笔记之Linux Shell脚本教程:30分钟玩转Shell脚本编程
  • 原文地址:https://www.cnblogs.com/quguanwen/p/11158033.html
Copyright © 2011-2022 走看看