python基础学习16----模块
模块(module)的引入
import 模块名
调用模块中的函数的方式为
模块名.函数名
这种方式引入会相当于将模块中代码执行一遍,所以如果引入的模块中有输出语句,那么只写import 模块名,运行也会显示输出。
若想只引入模块中的某个函数,可以使用如下方法
from 模块名 import 函数名
这样可以直接使用函数名调用函数
但是有一个问题需要注意,这样虽然只引入了所需要的函数,但是如上所说,若模块中有输出语句,依然会执行
搜索路径
当要引入一个模块的时候,python解释器需要对模块进行搜寻,搜寻的顺序为
1.当前目录
2.在 shell 变量 pythonpath 下的每个目录。
3.默认路径,由安装过程决定的
搜索路径都存储在 system 模块的 sys.path 变量中,若我们想要寻找到我们自定义的不再当前目录的模块,那么我们可以在sys.path中
添加程序文件所在的路径。
import os
import sys
base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(base_dir)
这里__file__为当前文件所在的相对路径,通过abspath获得绝对路径,再通过dirname来去掉文件名,最终生成文件目录最高层的绝对路径并添加到
搜索路径中。
在此基础上,就可以使用以下方式引入不同包中的模块
from 包名 import 模块名
接下来简单介绍一下一些常用的模块
time模块
time模块常用内置函数
1.time.time()
返回当前时间的时间戳(1970纪元后经过的浮点秒数)
2.time.localtime()
格式化时间戳为本地的时间
import time
print(time.localtime())
#time.struct_time(tm_year=2018, tm_mon=9, tm_mday=20, tm_hour=16, tm_min=31, tm_sec=32, tm_wday=3, tm_yday=263, tm_isdst=0)
3.time.asctime()
接受格式化元组形式的时间为参数,返回一个可读形式的时间
time1=time.localtime()
print(time.asctime(time1))#thu sep 20 16:35:44 2018
4.time.ctime()
接受一个时间戳为参数,将其转变为可读形式的时间
print(time.ctime(time.time()))#thu sep 20 16:42:03 2018
5.time.strftime()
time.strftime(format,time)
接收以结构化时间元组为参数,并返回以可读字符串表示的当地时间,格式由参数format决定
print(time.strftime("%y-%m-%d %h:%m:%s",time.localtime()))#2018-09-20 16:46:30
%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 当前时区的名称
%% %号本身
6.time.sleep()
time.sleep(sec)
表示将进程挂起sec秒
random模块
1.random.random()
生成一个0---1的随机浮点数
2.random.uniform()
生成一个指定范围的随机浮点数
print(random.uniform(4,7))
print(random.uniform(7,4))
参数没有必要第一个小,第二个大
3.random.randint()
生成一个指定范围内的随机整数
print(random.randint(4,7))# 4<= n<=7
这里参数必须是第一个小于等于第二个参数
4.random.randrange()
生成一个指定范围内的随机整数,第三个参数为间隔
print(random.randrange(1,100,2))#1--100之间的一个随机奇数
5.random.choic()
在一个序列中随机选择一项
print(random.choice([1,3,4,7,8]))
6.random.sample()
在序列中选取规定数量的元素放到一个列表中返回
print(random.sample([1,3,4,7,8],3))#[1,4,7]
7.random.shuffle()
将序列打乱,重排
list1=[1,3,4,7,8]
random.shuffle(list1)
print(list1)
os模块
1.os.name
对于windows,它是'nt',而对于linux/unix用户,它是'posix'
print(os.name)
2.os.getcwd()
返回当前的工作目录
3.os.listdir()
将指定目录下的所有文件名返回到一个列表中,不区分目录和文件
print(os.listdir(os.getcwd()))
4.os.remove()
删除指定文件
5.os.rmdir()
删除指定目录
6.os.mkdir()
创建目录,只能建一层
7.os.makedirs()
创建目录,可以递归创建很多层
8.os.path.isfile()
判断指定对象是否为文件,是则返回true,否则返回false
9.os.path.isdir()
判断指定对象是否为目录,是则返回true,否则返回false
10.os.path.exists()
判断文件或目录是否存在
11.os.path.split()
返回路径的目录和文件名到一个元组中
12.os.chdir()
改变当前工作目录到指定的路径
13.os.path.getsize()
获得文件的大小,如果为目录则返回0
14.os.path.abspath()
返回绝对路径
15.os.path.join(path, name)
连接目录和文件名
16.os.path.basename(path)
返回文件名
17.os.path.dirname(path)
返回文件路径
18.os.sep
当前平台的路径分隔符
sys模块
1.sys.argv
sys.argv列表,用于接收外部向程序传递的参数,列表第一项为当前py文件的文件名,之后的元素为传递的参数。
例如在cmd运行py文件可在其后加参数
2.sys.exit(n)
参数n为0表示正常退出,其他参数为异常,可以捕获
3.sys.path
sys.path是一个列表,存放模块的搜索路径
4.sys.platform
返回当前平台
5.sys.modules
sys.modules是一个全局字典,该字典是python启动后就加载在内存中。每当程序员导入新的模块,sys.modules将自动记录该模块。当第二次再导入该模块时,python会直接到字典中查找,从而加快了程序运行的速度。它拥有字典所拥有的一切方法
hashlib模块
这里我们直接看一段代码
import hashlib
m=hashlib.md5()
m.update("hello world".encode("utf-8"))
print(m.hexdigest())#5eb63bbbe01eeed093cb22bb8f5acdc3
m.update("123".encode("utf-8"))
print(m.hexdigest())#46d7a9532282332f023c08fe25ff7105
n=hashlib.md5()
n.update("hello world123".encode("utf-8"))
print(n.hexdigest())#46d7a9532282332f023c08fe25ff7105
hashlib是用来加密的模块,上述第二个m.update就相当于在之前的字符串后边加上123,然后再次加密
除了md5加密方式还有 sha1, sha224, sha256, sha384, sha512.
logging模块
import logging
logging.debug("debug")
logging.info("info")
logging.warning("warning")
logging.error("error")
logging.critical("critical")
有五种日志记录方式,按等级依次是从低到高,输出方式是输出到屏幕
可是直接运行输出到屏幕的只有
warning:root:warning
error:root:error
critical:root:critical
原因是日志输出等级有限制,那么怎么改变等级的限制呢
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='myapp.log',
# filemode='w'
)
这里通过上面的方法,level设置等级,format是输出格式化方式,datefmt为日期的输出格式,在添加了上述代码后再次运行屏幕会显示
thu, 20 sep 2018 19:33:50 模块.py[line:74] debug debug
thu, 20 sep 2018 19:33:50 模块.py[line:75] info info
thu, 20 sep 2018 19:33:50 模块.py[line:76] warning warning
thu, 20 sep 2018 19:33:50 模块.py[line:77] error error
thu, 20 sep 2018 19:33:50 模块.py[line:78] critical critical
这样就都能够显示了,那logging.basicconfig中filename和filemode是做什么的呢
当把上述注释了的两行恢复,那么这些日志就只会以文件的方式存储,不会再在屏幕中打印filename为存储的文件名,filemode为存储方式
接下来问题就来了,如果我既想在屏幕输出,又想在文件中存储怎么办?
第二个问题,如果我想根据不同的情况,类别,把日志分别存储怎么办?
import logging
logger = logging.getlogger(log_type)
logger.setlevel(log_level)
ch = logging.streamhandler()
ch = setlevel(log_level)
fh = logging.filehandler(log_file)
fh.setlevel(log_level)
formatter = logging.formatter('输出格式')
ch.setformatter(formatter)
fh.setformatter(formatter)
logger.addhandler(ch)
logger.addhandler(fh)
logger.info("日志信息")
利用这种方式可通过getlogger建立不同的对象来管理不同的日志,同时可以根据情况来设置输出到屏幕,还是保存到文件,还是两者都是。
configparser模块
configparser是python用来处理配置文件的模块
首先可以使用它生成一个配置文件
import configparser
config=configparser.configparser()
config["default"]={"serveraliveinterval" : 45,
"compression" :"yes",
"compressionlevel" : 9,
"forwardx11" : "yes"}
config["bitbucket.org"]={"user" : "tom"}
config["topsecret.com"]={"port": 50022,
"forwardx11": "no"}
with open ("example.ini","w") as configfile:
config.write(configfile)
这里也可以直接使用config.read_dict(字典)来读取内容,最后生成的配置文件为
[default]
serveraliveinterval = 45
compression = yes
compressionlevel = 9
forwardx11 = yes
[bitbucket.org]
user = tom
[topsecret.com]
port = 50022
forwardx11 = no
接下来我们对这个配置文件进行一些增删改查的操作
config.read("example.ini")
print(config.sections())#['bitbucket.org', 'topsecret.com']
这里不会显示default,因为它是一个特殊项
print(config.defaults())
#ordereddict([('serveraliveinterval', '45'), ('compression', 'yes'), ('compressionlevel', '9'), ('forwardx11', 'yes')])
可以通过上述方式查看default中的内容
具体内容可以通过查看字典的方式来查看
print(config["bitbucket.org"]["user"])#tom
print(config["default"]["compression"])#yes
然后还有一种特殊的情况
for i in config["bitbucket.org"]:
print(i)
一般人会认为这里输出的是bitbucket.org中的键,但其实输出的是
user
serveraliveinterval
compression
compressionlevel
forwardx11
这里还会再将default中的键输出
删除操作
删除键值对
config.remove_option("bitbucket.org","user")
config.write(open ("example.ini","w"))
删除块section
config.remove_section("topsecret.com")
config.write(open ("example.ini","w"))
判断是否存在
print(config.has_section("bitbucket.org"))
修改
config.set("bitbucket.org","user","jerry")
config.write(open ("example.ini","w"))
这些有改变的操作要注意最后再写入文件config.write(open ("example.ini","w"))