模块(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 

例:

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')

转载于:https://www.cnblogs.com/wangjian941118/p/9476056.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367791.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JPA 2 | 获取联接以及我们是否应该使用它们

介绍 最近&#xff0c;我一直在与JPA 2中的FETCH JOINS一起使用&#xff0c;以期从数据库中急切地获取数据&#xff0c;并且我学到了很多关于为什么在日常操作中应避免使用Fetch Joins的知识。 今天的博客文章谈论了我在Fetch上的经历和学习&#xff08;主要基于当我在查询中有…

mysql yintint类型_MySQL服务器2 被嫌弃的胖子

1.sql的基本语法对数据库create database db1;  创建数据库对表&#xff1a;create database t1(id int,name char(10));  创建表show create table t1;  查看创建的t1表show tables;  查看所有的表desc t1;  查看表的详细结构对数据&#xff1a;insert into t1(id,n…

Html5表单元素-搜索框和上传文件框

1、search - 搜索框element/form/input/search.html<!doctype html><html><head> <title>search</title></head><body> <!-- search - 搜索框&#xff0c;文本框形式 --> <input type"search"…

Shell 简单的java微服务jar包 -- 部署脚本

部署描述&#xff1a; 1.jenkins 通过maven编译成jar 项目包 2.shell 脚本从jenkins机器发布到&#xff1a;目标主机 注释&#xff1a;次脚本没有写jar包的备份&#xff0c;有时间加上 脚本内容&#xff1a; #!/bin/bash#线上服务器列表 HOST_LIST${:2}#项目名 REMOTE_PROJECT$…

BZOJ 4552 [Tjoi2016Heoi2016]排序 | 二分答案 线段树

题目链接 题面 题目描述 在2016年&#xff0c;佳媛姐姐喜欢上了数字序列。因而他经常研究关于序列的一些奇奇怪怪的问题&#xff0c;现在他在研究一个难题&#xff0c;需要你来帮助他。这个难题是这样子的&#xff1a;给出一个1到n的全排列&#xff0c;现在对这个全排列序列进行…

python import 类 继承_python学习之类的继承

面向对象中一个重要的特性就是继承&#xff0c;继承的好处就是提高代码的重用率&#xff0c;减少不必要的代码。继承是父类与子类的关系&#xff0c;当子类继承了父类后&#xff0c;就具有了父类的所有变量和方法。在python中定义继承的语法是&#xff1a;class 派生类名(基类名…

Html5画布(canvas)实例之绘制矩形

路径方式绘制 - 矩形 | rect()canvas/shape/path/rect.html <!DOCTYPE HTML><html><head> <title>以路径的方式在 canvas 上绘制矩形的 demo</title></head><body> <canvas id"canvas" width"300" hei…

[patl1-046]整除光棍

解题关键&#xff1a;模拟除法 #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<iostream> #include<cmath> using namespace std; typedef long long ll; char ans[10002]; int main(){int n;cin>…

使用AspectJ审计Spring MVC Webapp。 第2部分

现在&#xff0c;如果您有兴趣创建一个以Aspectj的Aspect和Before批注的形式使用面向方面编程&#xff08;AOP&#xff09;的Spring MVC Webapp来审核用户对屏幕的访问&#xff0c;那么这是您想要阅读的博客。 正如我在上一个博客中所说的那样&#xff0c;审核用户对屏幕的访问…

服装店管理系统打造门店拓客、促活、存留营销方案

打造门店拓客、促活和存留营销方案对于服装店的管理系统来说是非常重要的。以下是一些可行的方案&#xff1a; 1. 会员管理系统&#xff1a;引入会员管理功能&#xff0c;建立会员档案&#xff0c;跟踪会员消费记录和偏好。通过会员系统&#xff0c;可以实施积分制度、生日礼品…

mysql添加映射模块_iis7.5中让html与shtml一样支持include功能(添加模块映射)

刚开始弄得时候&#xff0c;发现了很多错误&#xff0c;其实很简单&#xff0c;参考shtm原来的设置就可以了前提条件&#xff1a;ServerSideIncludeModule的安装&#xff1a;在安装iis的时候选择上该服务(“在服务端包含文件”&#xff0c;选项)即可&#xff0c;如下&#xff1…

全局对象与临时转换

全局对象 ECMAScript 规定全局对象叫做 global&#xff0c;但是浏览器把 window 作为全局对象 这些全局变量分为两种&#xff1a; ECMAScript 规定的global.parseIntglobal.parseFloatglobal.Numberglobal.Stringglobal.Booleanglobal.Object 浏览器自己加的属性window.alertwi…

Html5开发-使用Canvas绘制图片

呈现图片 | drawImage()canvas/media/image.html <!DOCTYPE HTML><html><head> <title>在 canvas 上呈现图片的 demo</title></head><body> <canvas id"canvas" width"800" height"600" sty…

文件上传控件bootstrap-fileinput的使用

一、准备1、插件下载地址&#xff1a;https://github.com/kartik-v/bootstrap-fileinput/ 下载后的压缩包解压文件夹内容如下&#xff1a; js&#xff1a;插件核心js代码&#xff0c;引用fileinput.min.js/fileinput.js即可&#xff0c;默认插件语言为英文&#xff0c;如需要中…

在JPA 2.1中使用@Convert正确完成映射枚举

如果您曾经在JPA中使用过Java枚举&#xff0c;那么您肯定会意识到它们的局限性和陷阱。 使用enum作为Entity的属性通常是一个很好的选择&#xff0c;但是2.1之前的JPA不能很好地处理它们。 它给了您2 1个选择&#xff1a; 托肖夫达林 Enumerated(EnumType.ORDINAL) &#xf…

python里orient_OrientDB Python连接操作

OrientDB Python连接操作Python的OrientDB驱动程序使用二进制协议。 PyOrient是git hub项目名称&#xff0c;它用于将OrientDB与Python连接起来并操作数据。 它适用于OrientDB 1.7及更高版本。以下命令用于安装PyOrient。pip install pyorient可以使用名为demo.py的脚本文件执行…

HTML5-画布(canvas)效果之-渐变色

<!DOCTYPE HTML><html><head> <title>渐变色</title></head><body> <canvas id"canvas" width"200" height"100" style"background-color: rgb(222, 222, 222)"> 您的浏…

ssh架构之hibernate(一)简单使用hibernate完成CRUD

1.Hibernate简介 Hibernate是一个开放源代码的对象关系映射(ORM)框架&#xff0c;它对JDBC进行了非常轻量级的对象封装&#xff0c;它将POJO与数据库表建立映射关系&#xff0c;是一个全自动的orm框架&#xff0c;hibernate可以自动生成SQL语句&#xff0c;自动执行&#xff0c…

使用AspectJ审计Spring MVC Webapp。 第1部分

如果您像我一样&#xff0c;那么您将拥有那种编程天&#xff0c;一切似乎都进展顺利。 您编写代码和测试&#xff0c;它就可以正常工作。 然后还有其他日子&#xff0c;非常糟糕的日子&#xff0c;在那儿&#xff0c;您知道所编写的所有内容都尽可能正确&#xff0c;并且代码拒…

GitHub注册和Git安装

一、注册GitHub GitHub官方地址&#xff1a;https://github.com。 在浏览器中打开GitHub网址&#xff0c;通过首页进行注册&#xff0c;如下图所示。 二、安装Git Git官方下载地址&#xff1a;http://git-scm.com/download/。 Git支持多平台&#xff08;Mac OS X/Windows/Linux…