模块(sys/os/序列化模块)

 sys 模块:

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

sys.modules   返回所有在当前这个python程序中导入的模块的

sys.exit   退出程序

sys.argv   返回一个列表 列表的第一个元素是执行这个文件的时候,写在python后面的第一个值, 之后的元素是在执行python的启动的时候可以写多个值.都会依次添加到列表中

os 模块:和操作系统进行交互的

工作目录相关:

 os.getcwd() 在那执行文件就获取当前文件地址

例:

import os
print(os.getcwd()) ==>F:\面向对象\180808

 os.chdir(新地址) 修改当前文件目录,相当于 shell下cd 

扫描二维码关注公众号,回复: 2762763 查看本文章

例:

import os
print(os.getcwd())
os.chdir(r"F:\面向对象\180807")
print(os.getcwd())
结果:
F:\面向对象\180808
F:\面向对象\180807

 os.curdir 返回当前目录  结果: .

os.pardir 获取当前目录的父级目录字符串名  结果: ..

创建文件/文件夹和删除文件/文件夹相关:

os.makedirs(文件名1/文件名2) 可生成多层递归目录

os.removedirs(文件1/文件2) 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,一次类推

os.mkdir(文件名) 生成单级目录 ,相当于shell中mkdir dirname

os.rmdir(文件名) 删除单级目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname

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

os.remove(文件名) 删除文件

os.rename(oldname,newname) 重命名文件名

和操作系统差异相关:

os.stat(路径)   获取文件/目录信息

os.sep   输出操作系统特定的路径分隔符, win下为"\\",Linux下为"/"

os.linesep 输出当前平台使用的行终止符, win下为"\t\n",Linux下为"\n"

os.pathsep 输出用于分割文件路径的字符串, win下为";",Linux下为":"

os.name  输出字符串指示当前使用平台,  win下为"nt",Linux下为"posix"

使用pyth来和操作系统命令交互:

os.system("base command") 运行shell命令,直接显示

os.popen("base command").read() 运行shell命令,获取执行结果

查看环境变量:

os.environ  获取系统环境变量

os.path

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.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[,path3[,...]]])   将多个路径组合后返回,第一个绝对路径之前的参数将被忽略

os.path.getatime(path) 返回path所指向的文件或者目录的最后访问时间

os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间

os.path.getsize(path) 返回path的大小

例:获取文件的路径

import os
print(__file__)
print(os.path.dirname(__file__))
print(os.path.dirname(os.path.dirname(__file__)))
结果:
F:/面向对象/180808/课堂练习.py
F:/面向对象/180808
F:/面向对象

序列化模块:json pickle shelve

序列化:将原本的字典、列表等内容转换成一个字符串的过程就叫做序列化. 

序列化的目的:1.把内容写入文件;2.网络传输数据

json模块:

json. dumps(dict)  将字典转化成字符串

例:

import json
dic = {"a":1,"b":2,"c":3}
str_dic = json.dumps(dic)
print(str_dic,type(str_dic)) ==>{"a": 1, "b": 2, "c": 3} <class 'str'>

 json.loads(str) 将字符串转化成字典

例:

import json
str_dic = '{"a": 1, "b": 2, "c": 3}'
dic = json.loads(str_dic)
print(dic,type(dic)) ==>{'a': 1, 'b': 2, 'c': 3} <class 'dict'>

json.dump(dict)  将字典写成字符串写入文件

例:

import json
dic = {"a":1,"b":2,"c":3}
with open("json_dumps",mode="w",encoding="utf-8")as f:
json.dump(dic,f)

 json.load(句柄)  从文件中读取并转化成字符串

例:

import json
with open("json_dumps",mode="r",encoding="utf-8")as f:
print(json.load(f)) ==>{'a': 1, 'b': 2, 'c': 3}

json能处理的数据类型有限,限制比较多 

限制:

1.json格式中字典的key必须是字符串数据类型

2.如果是数字为key,那么dump之后会强转成字符串数据类型

3.对元组做value的字典会把元组强制转换成列表

4.json不支持元组做key会报错

5.json处理文件中的字符串必须是双引号

6.能多次dump数据到文件中但不能load出来 多次写入数据到文件中用dumps从文件中读出数据用loads

7.json中集合不能使用dump/dumps方法

8.json中dumps元组类型会将元组强转成列表再转化成字符串

例: 中文格式的写入文件中的编码ensure_ascii

import json
dic = {"abc":1,"country":'中国'}
ret = json.dumps(dic,ensure_ascii=False)
print(ret) ==>{"abc": 1, "country": "中国"}

sort_keys对字典的key的首字母做排序

indent设置缩进

separators根据标点符号来换行

ensure_ascii 显示中文

例:

import json
dic = {"name":'小白','age':'18','hobby':["听歌",'画画']}
ret = json.dumps(dic,sort_keys=True,indent=4,separators=(",",":"),ensure_ascii=False)
print(ret)
结果:
{
    "age":"18",
    "hobby":[
        "听歌",
        "画画"
    ],
    "name":"小白"
}

json的其他参数是为了用户看着更方便,但是会相对浪费时间

 pickle模块: 与文件相关模式:rb,wb

pickle支持几乎所有的对象的序列化

pickle.dumps的结果是bytes类型

例:

import pickle
dic = {1:(2,3,4),('a','b'):4}
pic_dic = pickle.dumps(dic)
print(pic_dic) ==>b'\x80\x03}q\x00(K\x01K\x02K\x03K\x04\x87q\x01X\x01\x00\x00\x00aq\x02X\x01\x00\x00\x00bq\x03\x86q\x04K\x04u.' #bytes类型
new_dic = pickle.loads(pic_dic)
print(new_dic) ==>{1: (2, 3, 4), ('a', 'b'): 4}

一个类的对象也可用pickle.dumps存储起来

例:

import pickle
class Student:
def __init__(self,name,age):
self.name = name
self.age = age
one_person = Student("小白",18)
ret = pickle.dumps(one_person)
print(ret)
new_person = pickle.loads(ret)
print(new_person.name) ==>小白
print(new_person.age) ==>18

例:写入文件

import pickle
class Student:
def __init__(self,name,age):
self.name = name
self.age = age
one_person = Student("小白",18)
with open("pickle_demo","wb")as f:
pickle.dump(one_person,f)
with open("pickle_demo","rb")as f1:
ret = pickle.load(f1)
print(ret.name,ret.age) ==>小白 18

pickle支持几乎所有对象序列化  对象的序列化需要这个对象对应的类在内存中

例:对于多次dump/load的操作做了良好的处理

import pickle
with open("pickle_demo","wb")as f:
pickle.dump({"k1":"v1"},f)
pickle.dump({"k2":"v2"},f)
pickle.dump({"k3":"v3"},f)

with open("pickle_demo","rb")as f1:
while True:
try:
print(pickle.load(f1))
except EOFError:
break
结果:
{'k1': 'v1'}
{'k2': 'v2'}
{'k3': 'v3'}

shelve模块:

对于shelve模块如果写定一个文件并且改动比较少,读文件的操作比较多,且大部分读取都需要基于某个key来获得对应的value才用shelve

例:

import shelve
f = shelve.open("text")
f["key"] = {"k1":(1,2,3),"k2":"v2"}
f.close()
f = shelve.open("text")
content = f["key"]
f.close()
print(content) ==>{'k1': (1, 2, 3), 'k2': 'v2'}

hashlib模块:

定义:能把一个字符串数据类型的变量转换成一个定长的密文的字符串,字符串里的每一个字符都是一个十六进制的数字 且字符串到密文不可逆

对于相同的字符串用相同的算法相同的手段去进行摘要获得的值总是相同的

md5和sha1都是算法它们两个相互独立.

对于同一个字符串不管这个字符串有多长,只要是相同,无论在任何环境下,多少次执行在任何语言中使用相同的算法相同手段得到的结果永远是相同的;反之,只要不是相同的字符串,得到的结果一定不同

md5 32位字符,每个字符都是十六进制

sha1 40位字符,每个字符都是十六进制

例: md5

import hashlib
s = "abcd"
md5_obj = hashlib.md5()
md5_obj.update(s.encode("utf-8"))
ret = md5_obj.hexdigest()
print(ret,len(ret),type(ret)) ==>e2fc714c4727ee9395f324cd2e7f331f 32 <class 'str'>

例: sha1

import hashlib
s = "abcd"
sha1_obj = hashlib.sha1()
sha1_obj.update(s.encode("utf-8"))
ret = sha1_obj.hexdigest()
print(ret,len(ret),type(ret)) ==>81fe8bfe87576c3ecb22426f8e57847382917acf 40 <class 'str'>

md5比sha1快效率高

md5算法相对简单,比较普及  sha1算法相对复杂,计算速度也慢但是安全性更高,因为用的人少.

为了避免撞库问题我们需要对密码进行动态加盐

例: 

import hashlib
username = input(">>>>>")
password = input(">>>>>")
md5_obj = hashlib.md5(username.encode("utf-8"))
md5_obj.update(password.encode("utf-8"))
ret = md5_obj.hexdigest()
print(ret)
结果:
>>>>>你好
>>>>>123
36473306e94d8d0f8dc4af5d4d9e17cc

例: 文件是否一致的校验

import hashlib
md5_obj = hashlib.md5()
with open("hashlib_demo1","rb")as f:
md5_obj.update(f.read())
ret = md5_obj.hexdigest()
print(ret)

md5_obj = hashlib.md5()
with open("hashlib_demo2","rb")as f:
md5_obj.update(f.read())
ret1 = md5_obj.hexdigest()
print(ret1)
if ret == ret1:
print("True")
else:
print("False")

configparser模块:

定义:有一种固定格式的配置文件.有一个对应的模块去帮你做这个文件的字符串处理

配置文件后缀.ini

生成配置文件格式:

例:

import configparser
config = configparser.ConfigParser()
config["DEFAULT"] = {'ServerAliveInterval': '45',
'Compression': 'yes',
'CompressionLevel': '9',
'ForwardX11':'yes'
}
config['bitbucket.org'] = {'User':'hg'}
config['topsecret.server.com'] = {'Host Port':'50022','ForwardX11':'no'}
with open('example.ini', 'w') as configfile:
config.write(configfile)
结果:
[DEFAULT]        #section
serveraliveinterval = 45 #option
compression = yes     #option
compressionlevel = 9     #option
forwardx11 = yes        #option

[bitbucket.org] #section
user = hg #option

[topsecret.server.com] #setion
host port = 50022 #option
forwardx11 = no       #option

logging模块:

功能:

1.日志格式的规范

2.操作的简化

3.日志的分级管理

logging不能做的事:不能自动生成要打印的内容   

需要自己在开发的时候定好,哪些地方需要打印,打印的内容是什么,内容的级别

logging模块的使用方法:

1.普通配置形, 简单的,可定制化差

2.对象配置,复杂的,可定制化强

例:

import logging
logging.basicConfig(level=logging.DEBUG) #不写level默认答应警告以上的所有内容
logging.debug("debug message") #调试
logging.info("info message") #基础信息
logging.warning("warning message")#警告
logging.error("error message") #错误
logging.critical("critical message") #严重错误
结果:
DEBUG:root:debug message
INFO:root:info message
WARNING:root:warning message
ERROR:root:error message
CRITICAL:root:critical message

例:

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="logging_demo")
logging.debug("debug message") #调试
logging.info("info message") #基础信息
logging.warning("warning message")#警告
logging.error("error message") #错误
logging.critical("critical message") #严重错误

在屏幕上输出不用打印filename

写入文件要在baicconfig中写入文件名

basicconfig不能将一个logging信息即输出到屏幕上又输入到文件中

例: 将一个logging信息即输出到屏幕上又输入到文件中

import logging
logger = logging.getLogger()
fh = logging.FileHandler('test.log',encoding='utf-8') # 创建一个handler,用于写入日志文件
ch = logging.StreamHandler() # 再创建一个handler,用于输出到控制台
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') #创建一个日志输出格式
logger.setLevel(logging.DEBUG) #设置输出内容级别
fh.setFormatter(formatter) #文件管理操作符绑定一个格式
ch.setFormatter(formatter) #屏幕管理操作符绑定一个格式
logger.addHandler(fh) #logger对象可以添加多个fh和ch对象
logger.addHandler(ch)
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')

猜你喜欢

转载自www.cnblogs.com/wangjian941118/p/9476056.html