模块

模块

返回首页

模块就是我们的Py文件。

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

'''
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    输出用于分割文件路径的字符串 win下为;,Linux下为:
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)的第一个元素
os.path.basename(path)  返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
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所指向的文件或者目录的最后修改时间
os.path.getsize(path) 返回path的大小
'''

os模块方法使用演练:

import os

# print(os.getcwd()) #获取当期路径
######################################
# f=open("test.txt","w")  #在当前路径下创建一个文件
# print(os.getcwd()) #获取test.txt文件路径
### chdir是修改路径
### os.chdir(r"C:\Users\Administrator\PycharmProjects\py_fullstack_s4\day32") # cd
# os.chdir(r"/Users/george/PycharmProjects/Python/day22模块二") # 修改路径后
# f=open("test2.txt","w")  #再创建test2.txt文件
# print(os.getcwd()) #这里获取的test2.txt路径是chdir后的路径

######################################
# os.makedirs("aaaaa/bbb/ccc") #生成多层递归目录
# os.removedirs("aaa/bbb")  #若目录为空,则删除,并递归到上一级目录,如果也为空,则删除。

######################################
###listdir显示当前文件夹的所有信息的
# print(os.listdir(r"/Users/george/PycharmProjects/Python/day22模块二"))

######################################
#####stat 获取文件/目录信息
# print(os.stat(r"/Users/george/PycharmProjects/Python/day22模块二/test2.txt"))
# '''
# os.stat_result(st_mode=33188, st_ino=4335923208, st_dev=16777222, st_nlink=1, st_uid=501, st_gid=20, st_size=0,
# st_atime=1619177783, st_mtime=1619177783, st_ctime=1619177783)
# '''

######################################

# "george"+os.sep+"image"

print(os.name)
print(os.system("ls"))

# abs=os.path.abspath("test.txt")
# print(os.path.basename(abs))
# print(os.path.dirname(abs))

s1=r"/Users/george/PycharmProjects"
s2=r"Python/day22模块二"
print(s1+os.sep+s2)

ret=os.path.join(s1,s2)   # 推荐方式
print(ret)

sys模块:调用解释器

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

 

import sys

print(sys.version)    #获取Python解释程序的版本信息
print(sys.platform)   #返回操作系统平台名称
print(sys.argv)       #命令行参数List,第一个元素是程序本身路径
print(sys.maxsize)
print(sys.path)       #返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值

# sys.exit(n)        退出程序,正常退出时exit(0)

 

hashlib摘要算法:

hashlib是通过一个函数,将任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。

摘要算法可以辨别出数据舒是否被篡改过,因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推却很难,并且原始数据做一个bit的修改,都会导致计算出的摘要完全不同。

常见的摘要算法MD5就是。

import hashlib

m=hashlib.md5()
# print(m)
m.update("alex".encode("utf8")) #update的意思就是给alex加密 #534b44a19bf18d20b71ecc4eb77c572f
print(m.hexdigest())  #用hexdigest查看加密的结果
m.update("alex".encode("utf8"))  #在m的基础之上,在加一个alex,这是的m是alexalex,所以两个m的值不一样
print(m.hexdigest())

n=hashlib.md5()
n.update("alex".encode("utf8"))
n.update("alex".encode("utf8"))
print(n.hexdigest())

n=hashlib.md5("salt".encode("utf8"))
n.update(b"alexalex")
print(n.hexdigest())

m=hashlib.sha1()

time时间模块:

在python中,通常有三种方式来表示时间:时间戳、元组(struct_time)、格式化的时间字符串。

1、时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量,看time.time()的type类型就知道它是浮点float类型。

2、元组(struct_time):struct_time元组共有9个元素,分别为(年、月、日、时、分、秒、一年中第几周、一年中第几天、夏令时)。结构化时间是用来对时间进行操作的。

3、格式化的时间字符串(Format String):“1996-09-07”。

##### 时间戳
time = time.time()  #---返回当前时间的时间戳
print(time)
##### 时间字符串 l = time.strftime("%Y-%m-%d %X") #当期时间 '1996-09-07 00:32:18' print("当前时间为:",l) ##### 时间元组 r=time.localtime() # time.struct_time(tm_year=1996, tm_mon=9, tm_mday=7, # tm_hour=0, tm_min=32, tm_sec=42, tm_wday=2, # tm_yday=116, tm_isdst=0) print(r)

random随机数模块:

random的方法有:random、randint、randrange、choice、sample、uniform、shuffle。

1、random是随机取0到1的一个浮点数。

2、randint和randrange是随机取范围内的一个整数,但是int是可以取最后一位,而range不能取最后一位。

3、choice是在choice的[]中,可以定义不同的数据类型,choice随机取。

4、sample是在列表区间内,随机取两个数,第二个参数是定义随机取几个。

5、uniform是在区间范围内随机取一个大于头且小于尾的浮点数。

6、shuffe是将定义的列表数据随机打乱次序。

import random

print(random.random()) #拿到一个0到1的浮点型数字
print(random.randint(1,4))  #[1,4] 在1到4之间随机取一个整数
print(random.randrange(1,3))  #[1,3) randint和randrange的区别是int可以取到列表范围最后一位,而range不行。
print(random.choice([11,"22",[222],26,3,4])) #在choice的[]中,可以定义不同的数据类型,choice随机取
print(random.sample([11,26,3,4],2))  #在列表区间内,随机取两个数,第二个参数是定义随机取几个
print(random.uniform(1,3))  #在区间范围内随机取一个大于头且小于尾的浮点数

item=[1,23,33]
random.shuffle(item)  #将item的列表数据随机打乱次序
print(item)

logging模块:

在默认情况下,Python的logging模块将日志打印到了标准输出中,且只显示大于等于Warning级别的日志。这说明默认的日志级别设置为Warning(日志级别等级Critical>Error>Warning>Info>Debug),默认的日志格式为日志级别:Logger名称:用户输出消息。

灵活配置日志级别,日志格式,输出位置。

logging.debug('debug message')
num=1000
logging.info('cost %s'%num)
logging.warning('warning messagegfdsgsdfg')
logging.error('error message')
logging.critical('critical message')

日志的配置:通过congfig函数和logger对象。

配置参数:

logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有:

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用户输出的消息

congfig函数:

import logging

### congfig函数
### level是等级,通过level定义logging的等级。
### format是格式,按照自己定义的格式显示输出,asctime是时间,lineno是调用日志输出函数的语句所在的代码行,messages是用户输入的信息。
### datefmt是指定日期时间格式。
### filename是用指定的文件名创建FiledHandler,这样日志会被存储在指定的文件中。
### filemode是文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
logging.basicConfig(level=logging.DEBUG,
                    format="%(asctime)s [%(lineno)s] %(message)s",
                    datefmt="%Y-%m-%d %H:%M:%S",
                    filename="logger2",
                    filemode="a"
                    )

logging.debug('debug message')
num=1000
logging.info('cost %s'%num)
logging.warning('warning messagegfdsgsdfg') 
logging.error('error message')
logging.critical('critical message')

logger对象:建议使用logger对象。

######## logger对象
def get_logger():
    logger=logging.getLogger()   #拿到logger对象
    lfh=logging.FileHandler("logger.log")  # 文件流向 创建一个handler,用于写入日志文件
    lsh=logging.StreamHandler()   # 屏幕流向 再创建一个handler,用于输出到控制台
    logger.setLevel(logging.DEBUG)  #设定输出等级
    fm=logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
    logger.addHandler(lfh)   #logger对象可以添加多个lfh和lsh对象
    logger.addHandler(lsh)
    lfh.setFormatter(fm)   #设置lfh的日志格式,格式样子是fm定义的
    lsh.setFormatter(fm)
    return logger

Logger=get_logger()
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')

json序列化模块:

对象(变量)从内存中变成可存储或传输的过程称之为序列化 。

eval的使用:

d={"河北":["廊坊","保定"],"湖南":["长沙","韶山"]}
s=str(d)  #将d数据转换成字符串
print(s,type(s))

with open("data","w") as f:
    f.write(s)  #将转换后的d保存到文件data中。
with open("data") as f2: s2=f2.read() #读data文件中的数据 d2=eval(s2) #将读到的字符串数据转换成字典数据
print(d2["河北"]) #取字段key河北,得到河北的下属属地'{"河北":["廊坊","保定"],"湖南":["长沙","韶山"]}' print(d2["湖南"])

json序列化:只有两个方法,一个序列化方法,一个反序列化方法。

序列化是将数据转换成对应的字符串形式的数据。

反序列化是将对应的字符串数据转换成对应的数据类型。

json.dumps和json.loads:

import json
# d1={"河北":["廊坊","保定"],"湖南":["长沙","韶山"]}
d2={'name':"george"}
########### dumps 序列化操作
# s1=json.dumps(d1)  # 将字典d转为json字符串---序列化 ,拿到的是unicode的数据,这时的d是一个字符串,可以被写进文件里。
s2=json.dumps(d2)  # 将字典d转为json字符串---序列化 ,拿到的是unicode的数据,这时的d是一个字符串,可以被写进文件里。
# print(s1,type(s1))
print(s2,type(s2))
### 写入文件操作
f_write=open("new",'w')
# f_write.write(s1)  #这时的s就被写进了new文件。
f_write.write(s2)  #这时的s就被写进了new文件。
f_write.close()
########### loads 反序列化操作
### 读文件操作
f_read = open("new")
data1 = f_read.read()
data2 = json.loads(data1)
print(data2["name"])
import json
i=10
s='hello'
t=(1,4,6)
l=[3,5,7]
d={'name':"george"}
json_str1=json.dumps(i)
json_str2=json.dumps(s)
json_str3=json.dumps(t)
json_str4=json.dumps(l)
json_str5=json.dumps(d)
print(json_str1)   #'10'
print(json_str2)   #'"hello"'
print(json_str3)   #'[1, 4, 6]'
print(json_str4)   #'[3, 5, 7]'
print(json_str5)   #'{"name": "yuan"}'

Pickle模块:只能在Python之间进行数据交换。

import pickle
import datetime

t=datetime.datetime.now()  #返回的是当期时间
# print(t)
d1={"data":t}
s1=pickle.dumps(d1)
# print(d1)
#
# json.dump(d,open("new4","w")) #这样的d是不能被json序列化的
#
d2={"name":"alvin"}
s2=pickle.dumps(d2)  #pickle处理出来的是字节数据
# print(s)
# print(type(s))
#
f=open('new5',"wb")
f.write(s2)   #pickle处理的数据在写入文本后,是不能查看的,也就是说pickle是无法读的。
f.write(s1)   #pickle处理的数据在写入文本后,是不能查看的,也就是说pickle是无法读的。
f.close()

f=open("new5","rb")
data=pickle.loads(f.read())  #pickle的读,只能用反序列化读取。
print(data)
print(data["name"])

re正则模块:

  正则:对字符串的模糊匹配

  key:元字符(有特殊功能的字符)

  * 表示范围是多个,+ 表示范围是[1, +00],?表示范围是[0,1],{ } 表示的范围是{ n,m}

  注意:* 和+ 的区别是起始点,*可以有零,+只能从1开始到正无穷。

  \d代表数字,将数字单个表示,\d+代表数字,将数字整合在一起。

print(re.findall("\d+","af5324jh523hgj34gkhg53453"))

  点 "." :匹配除换行符\n以外的任意符号

print(re.findall("p....n","hello python"))
print(re.findall("p.*n","hello python"))

  字符集 [ ]:是匹配[ ]里的任意一个数据。

print(re.findall("a[bc]d","hasdabdjhacd"))   #结果是abd和acd

     * + ? {} :重复

print(re.findall("[0-9]{4}","af5324jh523hgj34gkhg53453"))
  ^:从字符串开始位置匹配
print(re.findall("^wang","wangdashj342jhg234"))

  $:从字符串结尾匹配

print(re.findall("wang$","wangdashj342jhg234wang"))

  ( ):分组

print(re.findall("(ad)+","addd"))
print(re.findall("(ad)+wang","adddwangfsdui"))
print(re.findall("(?:ad)+wang","adadwangfsdui"))   # “?:” 是取消优先级
print(re.findall("(?:\d)+wang","adad678423wang4234fsdui"))

    search;只匹配第一个结果

ret=re.search("\d+","djksf34asd3")
print(ret.group())

      match:只在字符串开始的位置匹配

ret=re.match("\d+","423djksf34asd3")
print(ret.group())
  split 分割
s2=re.split("\d+","fhd3245jskf54skf453sd",2)
print(s2)
ret3=re.split("l","hello yuan")
print(ret3)

  sub: 替换

ret4=re.sub("\d+","A","hello 234jkhh23",1)
print(ret4)
ret4=re.subn("\d+","A","hello 234jkhh23")
print(ret4)
 compile: 编译方法
c=re.compile("\d+")
ret5=c.findall("hello32world53") #== re.findall("\d+","hello32world53")
print(ret5)

 

 

--------- END --------

posted @ 2021-04-15 16:00  王先生是胖子  阅读(87)  评论(0编辑  收藏  举报