Python基础

回顾

        上篇博客我们简要介绍了包的相关知识和正则表达式,这部分非常重要希望大家好好参悟。最近,无事发生,或是说没发生什么重要的事。记得不真切了,应是卢梭的名言”命是弱者的借口,运是强者的谦辞。“,说的斩钉截铁,这点好啊,望我能不犹疑,人后的苦尚且还能克服,一些琐碎还是先放下吧,好了谈谈学习的事,成欤败欤?我们还需继续研究,今天我们学的是内置模块。

第六章        模块与包

内置模块

模块的介绍

        在Python中,一个模块是一个包含一组相关函数、变量和类的文件。模块可以被其他程序引用,以便在程序中使用它们。在Python中,一个模块是一个包含一组相关函数、变量和类的文件。模块可以被其他程序引用,以便在程序中使用它们,要使用模块,可以使用import语句将其引入到程序中。

在python中的内置模块有:

        math提供了一些基本的数学函数,如sin、cos、tan、sqrt等等。

        random提供了一些随机数生成函数,如随机整数、随机小数、随机选择等。

        time提供了一些与时间相关的函数,如获取当前时间、格式化时间、计时器等。

        datetime提供了日期和时间处理函数,如日期算术、日期比较、日期格式化等。

        re提供了正则表达式操作函数,用来匹配和操作字符串。

        os提供了与操作系统相关的函数,如文件操作、路径操作、进程操作、环境变量等。

        sys提供了一些与Python解释器相关的函数,如获取命令行参数、修改Python路径等。

        json提供了JSON数据编码和解码的功能等。

时间模块

和时间有关系的我们就要用到时间模块,在使用模块之前,应该首先导入这个模块

常用方法:                      

        time.sleep(sec)
                (线程)推迟指定的时间运行,单位为秒
        time.time
                获取当前时间戳


三种时间表现形式
        时间戳

                秒数
        格式化的时间字符串

                2023-07-31 21:54:16
        结构化时间

                它一般不是让人看的,让计算机看的

进行日期时间的运算

系统时间计算时间

时间日期格式化符号

%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00=59)
%S 秒(00-59)
%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天(001-366)
%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称
%% %号本身

OS模块

os模块是与操作系统交互的一个接口

  • 操作文件的创建

        生成多层递归目录

                os.makedirs()

        若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,以此类推

                os.removedirs()

        删除单机目录
                若目录不为空则无法删除,报错:

                相当于shell中rmdir dirname

                os.rmdir()

        列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印

                os.listdir()

        删除一个文件

               os.remove()

        重命名一个文件

                os.rename()

        重命名文件/目录

                os.rename("oldname","newname")

        获取文件/目录信息

                os.stat()

        运行shell命令,直接显示

                os.system()

        运送shell命令,获取执行结果

                os.popen()

        获取当前工作目录,即当前python脚本工作的目录路径

                os.getcwd()

        改变当前脚本工作目录,相当于shell下cd

                os.chdir()

  • 操作文件的路径

        返回path规范化的绝对路径

                os.path.abspath(path)

        将path分割成目录和文件名二元组返回

                os.path.split(path)

 

        返回path的目录。

                其实就是 os.path.split(path) 的第一个元素

 

        返回path最后的文件名。

                如何 path以 / \ 结尾,那么就会返回空值。

                即 os.path.split(path) 的第二个元素

                os.path.basename(path)

         如果path存在,返回True;

                如果path不存在,返回False

                 os.path.exists(path)

        如果path是绝对路径,返回True

                 os.path.isads(path)

        如果path是一个存在的文件,返回True。

                否则返回False

                 os.path.isfile(path)

        如果path是一个存在的目录,则返回True。

                否则返回False

                os.path.isdir(path)

        将多个路径组合后返回,第一个绝对路径之前的参数将被忽略

                os.path.join(path1[,path2[...]])

        返回path所指向的文件或者目录的最后访问时间

                os.path.getatime(path)

        返回path所指向的文件或者目录的最后修改时间

                os.path.getmtime(path)

        返回path的大小

                os.path.getsize(path)

  • 目录信息的结构说明

        stat 结构:

        st_mode

                inode 保护模式

        st_ino

                inode 节点号。

        st_dev

                inode 驻留的设备。

        st_nlink

                inode 的链接数。

        st_uid

                所有者的用户ID。

        st_gid

                所有者的组ID。

        st_size

                普通文件以字节为单位的大小;包含等待某些特殊文件的数据。

        st_atime

                上次访问的时间。

        st_mtime

                最后一次修改的时间。

        st_ctime

                由操作系统报告的"ctime"。在某些系统上(如Unix)是最新的元数据更改的时间,在其它系统上(如Windows)是创建时间(详细信息参见平台的文档)。

  • OS模块属性

os.sep 输出操作系统特定的路径分隔符

        win下为 "\"

        Linux下为 "/"

os.linesep 输出当前平台使用的行终止符

        win下为 "\r\n"

        Linux下为 "\n"

os.pathsep  输出用于分割文件路径的字符串

        win下为 ;

        Linux下为 :

os.name 输出字符串指示当前使用平台。

        win        'nt'

        Linux        'posix'

                ​​

random模块

import random

  • 随机小数

        大于0且小于1之间的小数

                 random.random()

        大于1小于3的小数

                random.uniform(1,3)

  • 随机整数

大于等于1且小于等于5之间的整数

        random.randint(1,5)

大于等于1且小于10之间的奇数

        random.randrange(1,10,2)

  • 随机选择一个返回

        随机选择多个返回,返回的个数为函数的第二个参数

                random.choice([1,'23',[4,5]])

        列表元素任意2个组合

                random.sample([1,'23',[4,5],2])

sys模块

sys模块是与python解释器交互的一个接口


sys.argv          

        命令行参数List,第一个元素是程序本身路径
sys.exit(n)        

        退出程序,正常退出时exit(0),错误退出sys.exit(1)
sys.version      

         获取Python解释程序的版本信息
sys.path          

        返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform      

        返回操作系统平台名称

序列化模块

Python中比较常用的序列化模块有:picklejson

json序列化其实就是字符串,序列化就是把其他数据类型转化为json字符串的过程,反序列化就是把json字符串转化为其他数据类型

json数据类型

d = {"name":"mark","age":18}

        这是json的序列化模式,注意是双引号

d = {'name':'mark','age':18}

        这是字典,单引号,与上面的json序列化的数据类型不同,要注意

  • json数据的作用

        解释器的字典

        json模块——>字符串

                把字典用json读取成字符串

  • json的相关操作

        针对数据

                json.dumps()

                json.loads()

        针对文件

                json.dump()

                json.load()

  • 将字典写入文件并以字典读出

       import json

        d ={"name": "coco", "age": 19}

        with open('a.txt', 'w', encoding='utf-8')as f:

                f.write(json.dumps(d))

        反序列化

        with open('a.txt', 'r', encoding='utf-8')as f3:

                res1 = f3.read()

                res2 = json.loads(res1)

                print(res2)

pickle模块

pickle的使用方式跟json一模一样,json中有四个方法,pickle也是这四个方法,但是他与json的区别就是pickie可以将所有的数据类型序列化,但是只能在python中使用,而json能够序列化的数据类型:dict,list,tuple,int,float,pickie序列化之后的结果是二进制。

  • pickle读取

        写入文件的内容不可以修改,怎么存的就怎么取出

        import pickle
        d = [1, 2, 3, 4]
 
        print(pickle.dumps(d))
        with open('a.txt', 'wb')as f:
                pickle.dump(d, f)
        with open('a.txt', 'rb')as f1:
                print(pickle.load(f1))##[1, 2, 3, 4]

hashlib模块

摘要算法:又称哈希算法,散列算法。通过一个函数把任意长度的数据转换长度固定的数据串(通常使用十六进制表示)

  • 加密算法

        算法:MD5, sha系列,sha1,sha128,sha256等

                m = hashlib.md5()

        指定加密数据:

                m.update(b)

        不管输入加密数据有多长,得到的加密串结构是固定的。

        加盐:加密的时候在多一个干扰项

logging模块

  • 什么是日志

        logging是Python标准库中的一个模块,用于记录日志信息。通过logging模块,我们可以在程序运行时输出各种级别的日志,包括调试信息、错误信息、警告信息等,方便程序的调试和维护。同时,我们还可以将日志信息保存到文件或者发送到其他地方,以便后续的查阅和分析。

  • 日志的级别

        导入logging模块

                import logging

        日志的输出级别

                logging.debug('debug message')

                logging.info('info message ')

                logging.warning('warning message')

                logging.error('error message')

                logging.critical('critical message')

                在Python中默认的日志级别设置为Warning级别

                日志级别等级 CRITICAL > ERROR > WARNING > INFO > DEBUG

  • 日志格式

format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s'

        filename:用指定的文件名创建FiledHandler,这样日志会被存储在指定的文件中。
        filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
        format:指定handler使用的日志显示格式。
        datefmt:指定日期时间格式。
        level:设置rootlogger(后边会讲解具体概念)的日志级别
        stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件(f=open(‘test.log’,’w’)),默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。

 

        format参数中可能用到的格式化串:
                %(name)s Logger的名字
                %(levelno)s 数字形式的日志级别
                %(levelname)s 文本形式的日志级别
                %(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
                %(filename)s 调用日志输出函数的模块的文件名
                %(module)s 调用日志输出函数的模块名
                %(funcName)s 调用日志输出函数的函数名
                %(lineno)d
调用日志输出函数的语句所在的代码行
                %(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
                %(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
                %(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
                %(thread)d 线程ID。可能没有
                %(threadName)s 线程名。可能没有
                %(process)d 进程ID。可能没有
                %(message)s 用户输出的消息

  • 日志的基本使用

        import logging

        file_handler = logging.FileHandler(filename='x1.log', mode='a', encoding='utf-8',)

指定日志存储的格式:
        logging.basicConfig(
                format='%(asctime)s - %(name)s - %(levelname)s -%(module)s - %(lineno)d行 - %(created)f :  %(message)s',
                datefmt='%Y-%m-%d %H:%M:%S %p', # 2023-09-25 10:23:31 AM
                handlers=[file_handler,],
                level=logging.DEBUG
        )


logging.debug('你好a aaa')
 

  • 日志的详细使用

logging库提供了多个组件:LoggerHandlerFilterFormatter
import logging


logger对象:负责产生日志
        logger = logging.getLogger('转账记录')


filter对象:负责过滤日志(直接忽略)


handler对象:负责日志产生的位置

        hd1 = logging.FileHandler('a1.log',encoding='utf8')  # 产生到文件的
        hd2 = logging.FileHandler('a2.log',encoding='utf8')  # 产生到文件的
        hd3 = logging.StreamHandler()  # 产生在终端的


formatter对象:负责日志的格式
        fm1 = logging.Formatter(
                fmt='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
                datefmt='%Y-%m-%d %H:%M:%S %p',
        )
        fm2 = logging.Formatter(
                fmt='%(asctime)s - %(name)s %(message)s',
                datefmt='%Y-%m-%d',
        )

绑定handler对象
        logger.addHandler(hd1)
        logger.addHandler(hd2)
        logger.addHandler(hd3)


绑定formatter对象
        hd1.setFormatter(fm1)
        hd2.setFormatter(fm2)
        hd3.setFormatter(fm1)


设置日志等级
        logger.setLevel(30)


记录日志
        logger.warning('写了半天 好累啊 好热啊')

  • 日志配置成字典格式使用重要

import logging
import logging.config

standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
                '[%(levelname)s][%(message)s]'  # 其中name为getlogger指定的名字

simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'

test_format = '%(asctime)s] %(message)s'
other_format = '[%(levelname)s][%(asctime)s]] %(message)s'

import os

base_dir = os.path.dirname(os.path.abspath(__file__))

log_path = os.path.join(base_dir, 'log')

if not os.path.exists(log_path):
        os.mkdir(log_path)

logfile_path = os.path.join(log_path, 'a3.log')

log配置字典
LOGGING_DIC = {
    'version': 1,
    'disable_existing_loggers': False,
'formatters': {
        'standard': {
                'format': standard_format
                },
        'simple': {
                'format': simple_format
                },

        'other': {
                'format': other_format
                },

        },
'filters': {},

过滤日志
'handlers': {
       
打印到终端的日志
        'console': {
                'level': 'DEBUG',
                'class': 'logging.StreamHandler',  # 打印到屏幕
                'formatter': 'simple'
        },
       
打印到文件的日志,收集info及以上的日志
        'default': {
                'level': 'DEBUG',
                'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件
                'formatter': 'standard',
                'filename': logfile_path,  # 日志文件
                'maxBytes': 1024 * 1024 * 100,  # 日志大小 5M
                'backupCount': 5,
                'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了
        },
        'other': {
                'level': 'DEBUG',
                'class': 'logging.StreamHandler',  # 打印到屏幕
                'formatter': 'other'
                },

        },

'loggers': {
        logging.getLogger(__name__)拿到的logger配置  空字符串作为键 能够兼容所有的日志
         '': {
                'handlers': ['default', 'console'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
                'level': 'DEBUG',
                'propagate': True,  # 向上(更高level的logger)传递
        },  

当键不存在的情况下 (key设为空字符串)默认都会使用该k:v配置
        'default': {
                'handlers': ['default', ],
                'level': 'DEBUG',
                'propagate': False,
        },

        'console': {
                'handlers': ['console', 'default'],
                'level': 'DEBUG',
                'propagate': False,
        },
         'other': {
                'handlers': ['other'],
                'level': 'DEBUG',
                'propagate': False,
                 },
        },
}

使用配置字典

def common(xxx):
        logging.config.dictConfig(LOGGING_DIC) 

        自动加载字典中的配置
        logger1 = logging.getLogger(xxx)
        return logger1

logger=common('default')
logger.debug('xxx')
logger.info('xxx')
logger.warning('xxx')

第三方模块的下载与安装

之前学习的模块都是内置的模块,不需要安装的,直接拿来使用。但是,内置模块不能够满足我们日常的开发需求,有时候呢需要借助于一些第三方的模块(别人开发的,下载使用)

如何下载与使用第三方模块: pip 命令是有Python解释器提供的
        
pip install 模块名  

        默认装的是最新的版本
        pip3.8 install django==版本名

        pip list 查看解释器中已经安装了哪些模块

        为了加快下载的速度,我们把默认的官网源修改成我们国内的源

换源
国内的源:
        豆瓣:http://pypi.douban.com/simple/
        阿里云:http://mirrors.aliyun.com/pypi/simple/
        华为云:https://repo.huaweicloud.com/repository/pypi/simple
        清华大学:https://pypi.tuna.tsinghua.edu.cn/simple
        中科大:https://pypi.mirrors.ustc.edu.cn/simple/

换源的方法:
        pip install django

        默认使用的是python官方的
        pip3.8 install numpy -i http://mirrors.aliyun.com/pypi/simple/

        临时换源
    
永久换源:
        Windows 
        在文件地址栏输入:

                %APPDATA% 回车,快速进入 C:\Users\电脑用户\AppData\Roaming 文件夹中
        新建 pip 文件夹并
        在文件夹中新建 pip.ini 配置文件
        配置文件写入:
                如果想换源就直接把源的路径换了就可以了

                [global]
                index-url = https://mirrors.aliyun.com/pypi/simple
                [install]
                use-mirrors =true
                mirrors =https://mirrors.aliyun.com/pypi/simple
                trusted-host =mirrors.aliyun.com

 

        以后再命令行中,下载模块,就会走国内源了
pip3.8 install django==3.2.12

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值