Python 3学习 ——模块and包

本文介绍了Python中的各种实用模块,包括time、datetime、random等模块的基本使用方法,以及os和sys模块进行系统操作的方式。此外还详细讲解了hashlib加密、logging日志记录、configparser配置文件读写和re正则表达式的应用。

Python 学习——模块

 写此博客 是为了激励自己,并且将自己的心得以及遇到的问题与人分享

一、学习笔记

  1.time  模块  使用时需要 import time

    方法(前面有 * 是重点)

      *时间戳 —— time.time() 

      计算CPU工作的时间 —— time.clock()

      *使程序暂停 —— time.sleep()

      结构化时间(UTC世界标准时间) —— time.gmtime()

      *本地时间 —— time.localtime()

      *字符串时间(把元组类型时间转换成字符串类型时间) —— time.strftime ( '%Y--%m--%d  %H:%M:%S',struct_time) 

      *格式化时间 —— time.strptime('2018--04--02  16:06:25' , '%Y--%m--%d  %H:%M:%S')

      固定格式本地时间 —— time.ctime()

      结构化时间转换时间戳 —— mktime(tuple) 

   时间表达方式:

      ①时间戳  ②结构化时间  ③格式化时间

  2.datatime  模块  使用时需要import datatime

    友好的当前时间输出格式 —— datatime.datatime.now()  

  3.random  模块  使用时需要import random

    方法:

    取的是random内部的一个0-1的随机数 —— random.random()

    在a-b 中挑选一个随机数(不包括b) —— random.randrange(a,b)

    在a-b 中挑选一个随机数(包括ab)—— random.randint(a,b)

    序列中的随机一位 —— random.choice(序列)

    将序列顺序打乱 —— random.shuffle(序列)

    在序列中随机挑选(挑选的个数可控)—— random.sample(序列)

 

    实现5位验证码:

import random

def v_code():
    code = ''
    for i in range(5):
        add = random.choice([random.randrange(10),chr(random.randrange(65,91))])
        code += str(add)
    print(code)
v_code()

  4.os 模块  使用时需要进行 import os

    提供对操作系统进行调用的接口  以下为常用模块内方法,还有更多方法需要自己去查看

os.getcwd()  # 获取当前工作目录
os.chdir('')  #改变当前工作目录 相当于cd
os.curdir()   #返回当前目录
os.makedirs('abc')  #递归生成多层文件夹
os.mkdir('abcd')  #生成单个文件夹
os.rmdir('abcd')   #删除单个空文件夹
os.removedirs('abc')    #递归删除多层空文件夹  只能删除空文件
os.remove()  #删除一个文件 不能删除文件夹
os.listdir(r'D:\Python\newwork\2018\4')  #把当前目录的文件和文件夹都列出来  加'r'的意思是原生字符串r—'raw'
os.rename("oldname","newname")  #重命名  abc.txt 与 abc 是两个文件
os.stat()   #获取文件信息
os.sep()    #s = os.sep 就是'/' 取路径分隔符
os.linesep()    #输出当前操作系统下的换行分隔符
os.system("dir")    #运行shell命令 直接显示
os.environ()    #获取系统环境变量
os.path.abspath('./abc')    #拿到当前绝对路径
os.path.split(r'./abc')   #将path分割成目录和文件名以元组形式返回
os.path.dirname('绝对路径')   #返回的是当前参数的上一层文件夹的路径
os.path.exists(path)    #如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path)   #如果path是绝对路径,返回True
os.path.isfile(path)  #如果path是一个存在的文件,返回True。否则返回False
os.path.isdir(path)  #如果path是一个存在的目录,则返回True。否则返回False
os.path.join(path1[, path2[, ...]])  #将多个路径组合后返回,第一个绝对路径之前的参数将被忽略   用于路径拼接
os.path.getatime(path)  #返回path所指向的文件或者目录的最后存取时间
os.path.getmtime(path)  #返回path所指向的文件或者目录的最后修改时间

  5.sys 模块

    在跟Python解释器进行一个交互

sys.argv          #['D:/Python/newwork/2018/4/Sys.py']  命令行参数List,第一个元素是程序本身路径
sys.exit(0)       #退出程序,正常退出时exit(0)
sys.version       #获取Python解释程序的版本信息
sys.path          #返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform      #返回操作系统平台名称

提供对操作系统进行调用的接口

os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径

os.chdir("dirname")  改变当前脚本工作目录;相当于shell下cd
os.curdir  返回当前目录: ('.')
os.pardir  获取当前目录的父目录字符串名:('..')
os.makedirs('dirname1/dirname2')    可生成多层递归目录
os.removedirs('dirname1')    若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir('dirname')    生成单级目录;相当于shell中mkdir dirname
os.rmdir('dirname')    删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir('dirname')    列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.remove()  删除一个文件
os.rename("oldname","newname")  重命名文件/目录
os.stat('path/filename')  获取文件/目录信息
os.sep    输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep    输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
os.pathsep    输出用于分割文件路径的字符串
os.name    输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
os.system("bash command")  运行shell命令,直接显示
os.environ  获取系统环境变量
os.path.abspath(path)  返回path规范化的绝对路径
os.path.split(path)  将path分割成目录和文件名二元组返回
os.path.dirname(path)  返回path的目录。其实就是os.path.split(path)的第一个元素s.path.isabs(path)  如果path是绝对路径,返回True
os.path.isfile(path)  如果path是一个存在的文件,返回True。否则返回False
os.path.isdir(path)  如果path是一个存在的目录,则返回True。否则返回False
os.path.join(path1[, path2[, ...]])  将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
os.path.getatime(path)  返回path所指向的文件或者目录的最后存取时间
os.path.getmtime(path)  返回path所指向的文件或者目录的最后修改时间

  6.hashlib 模块

    加密模块,明文转换成密文

    方法:

      md5:

import hashlib

m = hashlib.md5()
print(m)

m.update('liufeiduo'.encode('utf-8'))

print(m.hexdigest()) #e2f6bc27dc37d79d001ac23de219405c

m.update('chengjunfei'.encode('utf8'))

print(m.hexdigest()) #d42cd42ef82be547e590d7c5df619616

    sha:一般用的最多的是sha256()

import hashlib

s = hashlib.sha256()

s.update('liufeiduo'.encode('utf8'))

print(s.hexdigest())  #322c30ff9a3f504f47df4e6023d84d677ed3e995731cc6955b3e16acbbdb8bcc

   7.logging 模块

    logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等。

    

import logging

logging.debug('debug message')
logging.info('info message')
logging.warning('hello message')
logging.error('error message')
logging.critical('cirtical message')
-------------------------------- WARNING:root:hello message ERROR:root:error message CRITICAL:root:cirtical message --------------------------------

    默认情况下Python的logging模块将日志打印到了标准输出中,且只显示了大于等于warning级别的日志,说明默认的日志级别设置为warning,默认的日志格式为日志级别:Logger名称:用户输出消息。  (日志级别等级CRITICAL >  ERROR > WARNING > INFO > DEBUG > NOTEST)

    import logging

logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',# 格式完全由我们自己设定的
                    datefmt='%a, %d %b %Y %H:%M:%S',
                    filename='test.log',  # 并且改变了输出方式,输出成一个文件。
                    filemode='w')# 记录的内容会对应到文件当中 'w' 可以改成 'a'进行追加模式

logging.debug('debug message')
logging.info('info message')
logging.warning('hello message')
logging.error('error message')
logging.critical('cirtical message')


-------------生成的Test文件----------------------------------------------
Mon, 09 Apr 2018 19:43:32 Logging.py[line:13] DEBUG debug message
Mon, 09 Apr 2018 19:43:32 Logging.py[line:14] INFO info message
Mon, 09 Apr 2018 19:43:32 Logging.py[line:15] WARNING hello message
Mon, 09 Apr 2018 19:43:32 Logging.py[line:16] ERROR error message
Mon, 09 Apr 2018 19:43:32 Logging.py[line:17] CRITICAL cirtical message
------------------------------------------------------------------------

    可见在logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有
    filename:用指定的文件名创建FiledHandler(后边会具体讲解handler的概念),这样日志会被存储在指定的文件中。
    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用户输出的消息

    

    两种输出方式:屏幕add文件

#author:"LFD"
#date: 2018/4/9

import logging

logger = logging.getLogger()    # 拿到一个logger对象 用来做日志的
# 创建一个handler,用于写入日志文件
fh = logging.FileHandler('test.log')# 文件输出流对象 文件对象 把所有信息放在test.log中  文件输出对象
  
# 再创建一个handler,用于输出到控制台
ch = logging.StreamHandler()    # 屏幕输出流 屏幕对象                    屏幕输出对象

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 把格式封装成了一个对象

fh.setFormatter(formatter)
# 文件输出取来了标准输出格式 可以与屏幕输出格式不相同
ch.setFormatter(formatter)
# 屏幕输出取来了标准输出格式

logger.addHandler(fh) #logger对象可以添加多个fh和ch对象
# addHandler() 通过这种方法增加了两种输出方式
logger.addHandler(ch)
logger.setLevel(logging.DEBUG)  #调整级别 

logger.debug(
'logger debug message') logger.info('logger info message') logger.warning('logger warning message') logger.error('logger error message') logger.critical('logger critical message') 由于级别没有更改 默认的是warning 所以只输出了三条   ------------------------------------------------------------------- 2018-04-09 20:07:10,747 - root - WARNING - logger warning message 2018-04-09 20:07:10,747 - root - ERROR - logger error message 2018-04-09 20:07:10,747 - root - CRITICAL - logger critical message -------------------------------------------------------------------
  调整级别 使用语句
logger.setLevel(logging.DEBUG)

     8.configparser  模块

      用于生成和修改常见配置文档

      生成一个配置文件

#author:"LFD"
#date: 2018/4/10


import configparser

config = configparser.ConfigParser()
config["DEFAULT"] = {'ServerAliveInterval': '45',
                     'Compression': 'yes',
                     'CompressionLevel': '9'}

config['bitbucket.org'] = {'User':'hg'}

config['topsecret.server.com'] = {}
topsecret = config['topsecret.server.com']
topsecret['Host Port'] = '50022'  # mutates the parser
topsecret['ForwardX11'] = 'no'  # same here
config['DEFAULT']['ForwardX11'] = 'yes'
with open('example.ini', 'w') as configfile:
    config.write(configfile)





运行完生成的.ini文件
-------------------------------------
[DEFAULT]
serveraliveinterval = 45
compression = yes
compressionlevel = 9
forwardx11 = yes

[bitbucket.org]
user = hg

[topsecret.server.com]
host port = 50022
forwardx11 = no
-------------------------------------

      对配置文件进行操作

import configparser

config = configparser.ConfigParser()
config.read('example.ini')
print(config.sections())   # ['bitbucket.org', 'topsecret.server.com'] 默认的DEFAULT没有拿出来,如果想拿出来
                           #  要用一个别的方法将其取出
print(config.defaults())   # OrderedDict([('serveraliveinterval', '45'), ('compression', 'yes'),
                           # ('compressionlevel', '9'), ('forwardx11', 'yes')])

print(config['bitbucket.org']['User'])  #hg

for key in config['bitbucket.org']:
    print(key)

----------------
user
serveraliveinterval
compression
compressionlevel
forwardx11
----------------
config.remove_section('topsecret.server.com')
config.write(open('i.cfg','w'))   # 并不是修改 而是直接覆盖 将修改后的生成到一个新文件中

config.remove_option('bitbucket.org','user') #将user键删除

config.set('bitbucket.org','user','lfd') #  user = lfd

   9.re 模块(正则表达式)

    正则表达式是用来匹配字符串的。

    引入正则表达式:为了进行模糊匹配

    它内嵌在Python中的 re 模块

     元字符:  

      ' . '  代指所有的字符,除了换行符,但只能代指任意一个字符。

      ' ^ ' 只从一开始进行匹配,匹配到了第一个就不继续匹配了,匹配不到也不继续了。

      ' $ ' 只从末尾开始进行匹配,匹配原则同上。

      ' * '  重复匹配 [ 0 , +∞ ]

      ' + ' 重复匹配 [ 1 , +∞ ]

      ' ? ' [ 0 , 1 ]   re.findall('a?b','aabadsaaaaabbbaaaa')  可以有0个a或一个a 必须得有b 才能匹配出来

        import re
        ret = re.findall('a?b','aabadsaaaaabbbaaaa')
        print(ret)  #  ['ab', 'ab', 'b', 'b']

      ' { ' 匹配几次自己定,可以加范围。

        import re
        # {1,}等价与{1,+∞}
        ret = re.findall('a{5}b{2}','aabadsaaaaabbbaaaa') #['aaaaabb']
        ret = re.findall('a{1,5}','aabadsaaaaabbbaaaa')# 贪婪匹配 ['aa', 'a', 'aaaaa', 'aaaa']

        print(ret)  #  ['ab', 'ab', 'b', 'b']

      结论:* 等价于 { 0 , + ∞ }    + 等价于 { 1 , +∞ }   ?  等价于{ 0 , 1 }          推荐前者

      ' [ ' 字符集 从字符集中 N 选一  

1 import re
2  
3 x1 = re.findall('a[cd]x','adx')
4 print(x1)  #['adx']
5 x2 = re.findall('[a-z]','adx')
6 print(x2)  #['a', 'd', 'x']

      取消元字符的特殊功能(\  ^   - 除外)

1 import re
2 ret = re.findall('[w*]','adxw*')   #['*', 'w', '*']
3 print(ret)

      ^ 放在 [ ] 中 意思是取反

1 import re
2 ret = re.findall('[^45]','dhsjka4d5')  # 把4,5排除在外取剩下的所有
3 print(ret)      #['d', 'h', 's', 'j', 'k', 'a', 'd']

      ' \ ' :(都是正则表达式提供的规范)

        反斜杠后边跟着元字符去除特殊功能

        反斜杠跟着普通字符实现特殊功能(跟着某些普通字符)

        \d 匹配任何十进制数;相当于类 [ 0 - 9 ]

        \D 匹配任何非数字字符;相当于类 [ ^0 - 9 ]

        \s 匹配任何空白字符;相当于类 [ \t\n\r\f\v ] 

        \S 匹配任何非空白字符;相当于类 [ ^ \t\n\r\f\v ] 

        \w 匹配任何字母数字符;相当于类 [ a-zA-Z0-9_ ]

        \W 匹配任何非字母数字符;相当于类 [ ^ a-zA-Z0-9_ ]

        \b 匹配一个特殊边界,也就是指单词和特殊字符的边界

 加个r 的意思是告诉Python解释器 里面的内容是原生字符串,不需要再转义了
1 import re
2 ret = re.findall(r'I\b','I am a LIST') # 取出的是有边界(特殊字符)的'I'
3 print(ret)     #    ['I']

      search方法:

1 import re
2 # search() 匹配出第一个满足条件的结果
3 ret = re.search('ad','fjkhadjkiad')
4 print(ret)  #print(re.search('ad','fjkhadjkiad'))# <_sre.SRE_Match object; span=(4, 6), match='ad'>
5 print(ret.group()) #ad

        \ 加上元字符

1 import re
2 ret = re.search('a\.','a.gj').group()
3 print(ret)  #a. '\' 使元字符'.'取消了原有功能就变成了一个'.'

        \ \ 

1 import re
2 ret = re.findall(r'\\','abc\de') # 加个r 的意思是告诉Python解释器 里面的内容是原生字符串,不需要再转义了
3 print(ret)  #['\\']
4 
5 m = re.search('\bblow','blow')
6 print(m)     #None

      ' ( ' 分组匹配

1 import re
2 print(re.search('(as)+','sdjkasas').group())    # asas

    正则表达式方法:

      findall():所有结果都返回到一个列表里

      search():返回一个对象(object),对象可以调用group()返回结果

      match():只在字符串开始匹配,也返回匹配到的第一个对象(object),对象可以调用group()

      split():从所给字符处进行分组

1 import re
2 ret = re.split('s','asdfhsasd')
3 print(ret)      #['a', 'dfh', 'a', 'd']

       注意split()方法的分隔顺序,先对 j 进行分隔,再对 s 进行分离。

import re
ret = re.split('[j,s]','a1sdjfhsasd')  # 如果s前面没有字符,那么会输出一个' '。
print(ret)      #['a1', 'd', 'fh', 'a', 'd']

      sub():替换功能

1 import re
2 ret = re.sub('l.d','cjf','hehakjlfdsd',2)#一共要有三个参数 规则 这个2 指的是替换的次数   
3 print(ret)  #   hehakjcjfsd

      compile():用于将字符串形式的正则表达式编译为Pattern对象。可以把一个正则表达式编译成一个正则表达式对象,可以提高一定的效率。

      finditer():返回的结果将封装成一个迭代器。

  10.模块的概念

    模块是为了组织函数而诞生

    在Python中,一个.py文件就是一个模块。模块的好处是可以大大提高了代码的可维护性。

    模块一共有三种:Python标准库、第三方模块、应用程序自定义模块

    导入模块一共有三种方式:

      import 语句:对自定义模块中的所有方法有所调用,加载多个模块时可以用逗号分隔。

import cal  #解释器通过搜索路径找到 cal.py后,将cal.py内部的所有代码都给了cal = cal.py all code
print(cal.add(1,3))    #4

      from  import 语句:对模块中某些方法需要使用。

from cal import add,sub
print(add(1,2)) #3
print(sub(4,1)) #3

      from import * 语句:一般不使用,会覆盖掉已有的定义。

from cal import *
print(add(1,2)) #3
print(sub(4,1)) #3

print(x)    #3

 

  11.包

    为了按照目录来组织模块而诞生

    包的调用

# 错误的调用方式from web.web2 import logger.logger //import web.web2.logger
#正确的调用方式
from web import logger  # 一层的包
from web.web2 import logger #两层的包
logger.logger()
from web.web2.logger import logger # 调用logger内部的某一个方法 
logger()

    import 一个模块是将内部所有内容加载了一遍,但import一个包是仅执行了包中的_init_文件。

   设置项目的绝对路径:

1 #--------------------------
2 # 将目录的相对路径设置成为绝对路径,为的是在不同的Python环境下都可以运行你的代码找到相应的
3 # 包或者模块来使用
4 import sys,os
5 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
6 sys.path.append(BASE_DIR)
7 #--------------------------

 

转载于:https://www.cnblogs.com/jinzejun/p/8670126.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值