shelve

xml处理

configparser

hashlib

logging

 

shelve模块

shelve是一个简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式

import shelve

sw = shelve.open('shelve_test.pkl') # 创建shelve对象

name = ['13', '14', '145', 6] # 创建一个列表

dist_test = {"k1":"v1", "k2":"v2"}

sw['name'] = name # 将列表持久化保存

sw['dist_test'] = dist_test

sw.close() # 关闭文件,必须要有

sr = shelve.open('shelve_test.pkl')

print(sr['name']) # 读出列表

print(sr['dist_test']) # 读出字典

sr.close()

 

xml处理模块

xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀,至今很多传统公司如金融行业的很多系统的接口还主要是xml。

xml的格式如下,就是通过<>节点来区别数据结构的:

<?xml version="1.0"?>

<data>

<country name="Liechtenstein">

<rank updated="yes">2</rank>

<year>2008</year>

<gdppc>141100</gdppc>

<neighbor name="Austria" direction="E"/>

<neighbor name="Switzerland" direction="W"/>

</country>

<country name="Singapore">

<rank updated="yes">5</rank>

<year>2011</year>

<gdppc>59900</gdppc>

<neighbor name="Malaysia" direction="N"/>

</country>

<country name="Panama">

<rank updated="yes">69</rank>

<year>2011</year>

<gdppc>13600</gdppc>

<neighbor name="Costa Rica" direction="W"/>

<neighbor name="Colombia" direction="E"/>

</country>

</data>

xml协议在各个语言里的都 是支持的,在python中可以用以下模块操作xml

import xml.etree.ElementTree as ET

tree = ET.parse('test.xml') # 读取xml文件,并以Element对象的形式保存

root = tree.getroot() # 获取根

for child in root: # 遍历root下的子标签

print(child.tag, child.attrib) # 打印标签名和属性

for i in child:

print(i.tag, i.text, i.attrib) # 打印标签名值和属性

输出结果:

country {'name': 'Liechtenstein'}

rank 2 {'updated': 'yes'}

year 2008 {}

gdppc 141100 {}

neighbor None {'direction': 'E', 'name': 'Austria'}

neighbor None {'direction': 'W', 'name': 'Switzerland'}

country {'name': 'Singapore'}

rank 5 {'updated': 'yes'}

year 2011 {}

gdppc 59900 {}

neighbor None {'direction': 'N', 'name': 'Malaysia'}

country {'name': 'Panama'}

rank 69 {'updated': 'yes'}

year 2011 {}

gdppc 13600 {}

neighbor None {'direction': 'W', 'name': 'Costa Rica'}

neighbor None {'direction': 'E', 'name': 'Colombia'}

我们也可以通过标签名来获取某一类标签的内容

for node in root.iter('year'): # 仅遍历标签名为year的标签

print(node.tag, node.text, node.attrib)

输出结果:

year 2008 {}

year 2011 {}

year 2011 {}

xml的常用操作

修改:

import xml.etree.ElementTree as ET

tree = ET.parse('test.xml') # 读取xml文件,并以Element对象的形式保存

root = tree.getroot() # 获取根

for node in root.iter('year'): # 遍历year标签

node.text = str(int(node.text) + 1) # 将year标签的值+1,注意,读出来的标签的值都是字符串形式,注意数据类型转换

node.set('updated', 'yes') # 更新该标签

tree.write('test_2.xml') # 将结果写到文件,可以写到源文件也可以写到新的文件中

删除:

import xml.etree.ElementTree as ET

tree = ET.parse('test.xml') # 读取xml文件,并以Element对象的形式保存

root = tree.getroot() # 获取根

for country in root.findall('country'): # 遍历所有country标签

rank = int(country.find('rank').text) # 在country标签查找名为rank的纸标签

if rank > 50: # 判断如果rank标签的值大于50

root.remove(country) # 删除该标签

tree.write('test_3.xml')

说明:

iter方法用于查找的最终标签,也就是下面没子标签的标签,获取他的值和属性的

findall方法用于查找还有子标签的子标签,然后和用fandall返回的对象的find方法获取找到的标签的子标签

创建自己的xml文档

import xml.etree.ElementTree as ET

new_xml = ET.Element("namelist") # 新建根节点,或者说xml对象

name = ET.SubElement(new_xml,"name",attrib={"enrolled":"yes"}) # 给新xml对象创建子标签

age = ET.SubElement(name,"age",attrib={"checked":"no"}) # name标签在创建子标签age,attrib变量为属性

sex = ET.SubElement(name,"sex")

sex.text = '33' # 给标签赋值

name2 = ET.SubElement(new_xml,"name",attrib={"enrolled":"no"})

age = ET.SubElement(name2,"age")

age.text = '19'

et = ET.ElementTree(new_xml) #生成文档对象

et.write("test.xml", encoding="utf-8",xml_declaration=True) # 将xml对象保存到文件xml_declaration表示xml文档的声明

ET.dump(new_xml) #打印生成的格式

 

 

ConfigParser模块

ConfigParser模块是用来处理配置文件的包,配置文件的格式如下:中括号“[ ]”内包含的为section。section 下面为类似于key-value 的配置内容。常见很多服务的都是类似这种格式的,比如MySQL

假设我们有这样一个配置文件

[DEFAULT]
name = www.qq.com
[dbs]
username = root
passord = 123.com
host = 127.0.0.1 [server]
name = www.baidu.com
port = 80

读取配置文件

import configparser

config = configparser.ConfigParser() # 创建configparser对象

config.read('example.ini') # 读取配置件

print(config.sections()) # 获取所有的session

输出结果

['dbs', 'server']

注意:

可以看到这里没有输出DEFAULT,因为在Python中DEFAULT session有特殊用途,相当于所有session的默认值,也就是当DEFAULT中定义了一个key和value,此时session中这个不存在的时候,这个key的值就是DEFAULT定义的value

例如

print(config['dbs']['name'])

输出结果就是

www.qq.com

说明:

可以看到读取配置文件后的返回的对象有点类似于字典,可以通过key的方式将配置文件中的值一一取出来,甚至可以使用in关键字判断key是否存在

print('server' in config)

输出结果

True

其他常用操作

读:

print(config.options('dbs')) # 获取某个session下的所有option,也就是key

输出结果

['username', 'passord', 'host', 'name']

print(config.items('dbs')) # 获取某个session的键值列表,类似字典的items方法

输出结果

[('name', 'www.qq.com'), ('username', 'root'), ('passord', '123.com'), ('host', '127.0.0.1')]

print(config.get('dbs', 'host')) # 获取某个session下的某个option的值

输出结果

127.0.0.1

port = config.getint('server', 'port') # 获取某个session下的某个option的值,并以int的方式返回

print(port)

print(type(port))

类似的方法还有getfloat和getboolean方法,当然前提是配置文件中的值就是对应的类型,否则会报错

说明:

配置文件中yes、True、1、true等为真,也就是通过getboolean返回的是True,no、False、0、false等为假,也就是返回的是False

删除:

config.remove_option('dbs','host') # 删除option

config.remove_section('server') # 删除session

 

 

hashlib模块

用于加密相关的操作,3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法

import hashlib

m = hashlib.md5()

m.update(b"Hello")

m.update(b"It's me")

print(m.digest())

m.update(b"It's been a long time since last time we ...")

print(m.digest()) #2进制格式hash

print(len(m.hexdigest())) #16进制格式hash

'''

def digest(self, *args, **kwargs): # real signature unknown

""" Return the digest value as a string of binary data. """

pass

def hexdigest(self, *args, **kwargs): # real signature unknown

""" Return the digest value as a string of hexadecimal digits. """

pass

'''

import hashlib

# ######## md5 ########

hash = hashlib.md5()

hash.update('admin')

print(hash.hexdigest())

# ######## sha1 ########

hash = hashlib.sha1()

hash.update('admin')

print(hash.hexdigest())

# ######## sha256 ########

hash = hashlib.sha256()

hash.update('admin')

print(hash.hexdigest())

# ######## sha384 ########

hash = hashlib.sha384()

hash.update('admin')

print(hash.hexdigest())

# ######## sha512 ########

hash = hashlib.sha512()

hash.update('admin')

print(hash.hexdigest())

 

 

logging模块

很多程序都有记录日志的需求,并且日志中包含的信息有正常的程序访问日志,还有可能有错误日志,警告信息输出,logging模块提供了标准的日志接口

日志等级:

CRITCAL = 50

ERROR = 40

WARING = 30

INFO = 20

DEBUG = 10

设置记录日志等级,这个等级(数值)以下(小于这个数值)的日志将不会被记录。

import logging

logging.warning("user [alex] attempted wrong password more than 3 times")#日志等级及日志内容

logging.critical("server is down")

#输出

WARNING:root:user [alex] attempted wrong password more than 3 times

CRITICAL:root:server is down

 

如果想把日志写到文件里,也很简单

import logging

logging.basicConfig(filename='example.log',level=logging.INFO)

logging.debug('This message should go to the log file')

logging.info('So should this')

logging.warning('And this, too')

其中下面这句中的level=loggin.INFO意思是,把日志纪录级别设置为INFO,也就是说,只有比日志是INFO或比INFO级别更高的日志才会被纪录到文件里,在这个例子, 第一条日志是不会被纪录的,如果希望纪录debug的日志,那把日志级别改成DEBUG就行了。

logging.basicConfig(filename='example.log',level=logging.INFO)

感觉上面的日志格式忘记加上时间啦,日志不知道时间怎么行呢,下面就来加上!

import logging

logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')

logging.warning('is when this event was logged.')

#输出

12/12/2010 11:46:36 AM is when this event was logged.

 

 

如果想同时把log打印在屏幕和文件日志里

import logging

#create logger

logger = logging.getLogger('TEST-LOG')

logger.setLevel(logging.DEBUG)

# create console handler and set level to debug

ch = logging.StreamHandler()

ch.setLevel(logging.DEBUG)

# create file handler and set level to warning

fh = logging.FileHandler("access.log")

fh.setLevel(logging.WARNING)

# create formatter

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# add formatter to ch and fh

ch.setFormatter(formatter)

fh.setFormatter(formatter)

# add ch and fh to logger

logger.addHandler(ch)

logger.addHandler(fh)

# 'application' code

logger.debug('debug message')

logger.info('info message')

logger.warn('warn message')

logger.error('error message')

logger.critical('critical message')

Python之常用模块(二)的更多相关文章

  1. python之常用模块二(hashlib logging configparser)

    摘要:hashlib ***** logging ***** configparser * 一.hashlib模块 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 摘要算法 ...

  2. Python中常用模块二

    一.hashlib   (加密) hashlib:提供摘要算法的模块 1.正常的md5算法 import hashlib # 提供摘要算法的模块 md5 = hashlib.md5() md5.upd ...

  3. python的常用模块之collections模块

    python的常用模块之collections模块 python全栈开发,模块,collections 认识模块 什么是模块?    常见的场景:一个模块就是一个包含了python定义和声明的文件,文 ...

  4. 常用模块二(hashlib、configparser、logging)

    阅读目录 常用模块二 hashlib模块 configparse模块 logging模块   常用模块二 返回顶部 hashlib模块 Python的hashlib提供了常见的摘要算法,如MD5,SH ...

  5. Python学习【第7篇】:Python之常用模块2

    hashlib,configparser,logging模块 一.常用模块二 hashlib模块 hashlib提供了常见的摘要算法,如md5和sha1等等. 那么什么是摘要算法呢?摘要算法又称为哈希 ...

  6. Python学习【第6篇】:Python之常用模块1

    常用模块一. collocations 模块 时间模块 random模块 os模块 sys模块 序列化模块 re模块 常用模块二:这些模块和面向对象有关 hashlib模块 configparse模块 ...

  7. Python之常用模块三(面向对象相关的三个模块)

    hashlib.configparser.logging模块 一.常用模块二 hashlib模块 hashlib提供了常见的摘要算法,如md5和sha1等等. 那么什么是摘要算法呢?摘要算法又称为哈希 ...

  8. Python之常用模块一(主要RE和collections)

    一.认识模块  什么是模块:一个模块就是一个包含了python定义和声明的文件,文件名就是加上.py的后缀,但其实import加载的模块分为四个通用类别 : 1.使用python编写的代码(.py文件 ...

  9. Python常用模块二

    一.time & datetime #_*_coding:utf-8_*_ import time # print(time.clock()) #返回处理器时间,3.3开始已废弃 , 改成了t ...

  10. python中常用模块详解二

    log模块的讲解 Python 使用logging模块记录日志涉及四个主要类,使用官方文档中的概括最为合适: logger提供了应用程序可以直接使用的接口API: handler将(logger创建的 ...

随机推荐

  1. linux c编程:信号(一)

    信号是软件中断,很多比较重要的应用程序都需要处理信号.并且信号提供了一种处理异步事件的方法.如终端用户键入中断键,会通过信号机制停止一个程序,或及早终止管道中的下一个程序 很多条件都可以产生信号,比如 ...

  2. ABAP--关于字符串String到XString XString to String转换代码

    转自http://guanhuaing.iteye.com/blog/1498891 代码如下 report zrich_0001. data: s type string, h(1) type x, ...

  3. Struts2学习总结(完整版)

    一.搭建struts2环境 1.jar包的导入 主要是到 解压其中的一个工程,得到里面lib下包含的jar包 把这里的所有的jar包拷贝到项目的 WEB-INF目录下的lib文件夹下面. 2.配置st ...

  4. Django——form组件is_valid校验机制

    #先来归纳一下整个流程#(1)首先is_valid()起手,看seld.errors中是否值,只要有值就是flase#(2)接着分析errors.里面判断_errors是都为空,如果为空返回self. ...

  5. sql查询字段是否为空

    sql 查询某字段为空 select * from 表名 where 字段名 is null sql 查询某字段不为空 select * from 表名 where 字段名 is not null s ...

  6. Linux服务器上的tomcat中部署web项目

    首先了解一下下面几个概念,讲得不太准确:1.JVMJVM是class以及jar(实际上就是很多个class压缩在一起)的运行环境,特征就是java和javaw命令,通过这两个命令,你可以执行class ...

  7. 视图的创建与使用 Sql Server View

    创建教材的三个数据表Student.Course及SC. create database S_T Use S_T CREATE TABLE Student (Sno CHAR(9), Sname CH ...

  8. 吴恩达机器学习笔记(四) —— BP神经网络

    主要内容: 一.模型简介 二.一些变量所代表的含义 三.代价函数 四.Forward Propagation 五.Back Propagation 六.算法流程 待解决问题: 视频中通过指出:当特征变 ...

  9. UVA 1493 Draw a Mess(并查集+set)

    这题我一直觉得使用了set这个大杀器就可以很快的过了,但是网上居然有更好的解法,orz... 题意:给你一个最大200行50000列的墙,初始化上面没有颜色,接着在上面可能涂四种类型的形状(填充):  ...

  10. html5新特性contenteditable 属性更容易实现动态表单

    介绍html5新特性的一个属性:contenteditable 作用域全局.所有的块标签都可以,例如:span.p.div.td等标签.但是,不可以作用域<br/>类型的标签. conte ...