Python学习第二阶段Day2(json/pickle)、 shelve、xml、PyYAML、configparser、hashlib模块

时间:2022-12-15 20:19:55

1.json/pickle   略。

2.shelve模块

import shelve

# shelve 以key value的形式序列化,value为对象
class Foo(object):
def __init__(self, n):
self.n
= n
s
= shelve.open("shelve_test")
name
= ["alex", "rain", "test"]
s[
"test"] = name
s[
"a"] = Foo(1)
s[
"b"] = Foo(2)


# 反序列化,提取对象

print(s.items()) # 提取所有
print(s.get("test")) # 提取单个

s.close()

 3.xml的处理

xml文件:country.xml

Python学习第二阶段Day2(json/pickle)、 shelve、xml、PyYAML、configparser、hashlib模块Python学习第二阶段Day2(json/pickle)、 shelve、xml、PyYAML、configparser、hashlib模块
<?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>
View Code

遍历等处理:

import xml.etree.ElementTree as ET

tree
= ET.parse("country.xml")
root
= tree.getroot()   # data 根节点

'''一般的节点<tag attrib="value"> text <tag/>
自结束标签<tag attrib="value"/>
'''

# 遍历xml文档
for child in root:
print(child.tag, child.attrib)
for i in child:
print(i.tag, i.text)

# 只遍历year 节点
for node in root.iter('year'):
print(node.tag, node.text)

 修改和删除:

import xml.etree.ElementTree as ET

tree
= ET.parse("country.xml")
root
= tree.getroot()

# 修改
for node in root.iter('year'):
new_year
= int(node.text) + 1
node.text
= str(new_year)
node.set(
"updated", "yes")

tree.write(
"country.xml")

# 删除node
for country in root.findall('country'): # 或者root.iter('country')
rank = int(country.find('rank').text)
if rank > 50:
root.remove(country)

tree.write(
'country.xml')

生成xml文件:

Python学习第二阶段Day2(json/pickle)、 shelve、xml、PyYAML、configparser、hashlib模块Python学习第二阶段Day2(json/pickle)、 shelve、xml、PyYAML、configparser、hashlib模块
import xml.etree.ElementTree as ET

new_xml
= ET.Element("infolist")
info
= ET.SubElement(new_xml, "info", attrib={"enrolled": "yes"})
name
= ET.SubElement(info, "name")
name.text
= 'akira'
age
= ET.SubElement(info, "age", attrib={"checked": "no"})
age.text
= '33'
sex
= ET.SubElement(info, "sex")
sex.text
= 'F'

info1
= ET.SubElement(new_xml, "info", attrib={"enrolled": "yes"})
name1
= ET.SubElement(info1, "name")
name1.text
= 'alen'
age1
= ET.SubElement(info1, "age", attrib={"checked": "no"})
age1.text
= '22'
sex1
= ET.SubElement(info1, "sex")
sex1.text
= 'M'

et
= ET.ElementTree(new_xml) # 生成文档对象
et.write("test.xml", encoding="utf-8", xml_declaration=True)
# <?xml version='1.0' encoding='utf-8'?>
ET.dump(new_xml) # 打印生成的格
View Code

生成的xml内容:

Python学习第二阶段Day2(json/pickle)、 shelve、xml、PyYAML、configparser、hashlib模块Python学习第二阶段Day2(json/pickle)、 shelve、xml、PyYAML、configparser、hashlib模块
<?xml version='1.0' encoding='utf-8'?>
<infolist>
<info enrolled="yes">
<name>akira</name>
<age checked="no">33</age>
<sex>F</sex>
</info>
<info enrolled="yes">
<name>alen</name>
<age checked="no">22</age>
<sex>M</sex>
</info>
</infolist>
View Code

 4.YAML

Python也可以很容易的处理ymal文档格式,只不过需要安装一个模块,参考文档:http://pyyaml.org/wiki/PyYAMLDocumentation 

例如下面的格式

Python学习第二阶段Day2(json/pickle)、 shelve、xml、PyYAML、configparser、hashlib模块Python学习第二阶段Day2(json/pickle)、 shelve、xml、PyYAML、configparser、hashlib模块
/etc/http/conf/http.conf:
file.managed:
- source: salt://apache/http.conf
- user: root
- group: root
- mode: 644
- template: jinja
- defaults:
custom_var:
"default value"
other_var:
123
View Code

5.configparser

修改配置文件的,格式:

[DEFAULT]
ServerAliveInterval
= 45
Compression
= yes
CompressionLevel
= 9
ForwardX11
= yes

[bitbucket.org]
User
= hg

[topsecret.server.com]
Port
= 50022
ForwardX11
= no

解析:(读取配置文件,并查询条目)

import configparser

conf
= configparser.ConfigParser()
conf.read(
"example.conf")
print(conf.defaults()) # DEFAULT下的条目:
# ["ServerAliveInterval":45,"Compression","yes"...]
print(conf.sections()) # 所有选项除DEFAULT:["bitbucket.org","topsecret.server.com"]

print(conf["DEFAULT"]["ForwardX11"]) # DEFAULT选项中的"ForwardX11"的值
print(conf["bitbucket.org"]["User"])
print(conf["topsecret.server.com"]["Port"])

for key in conf["DEFAULT"]: # 遍历DEFAULT条目
print(key, conf["DEFAULT"][key])

写入:

import configparser

conf
= configparser.ConfigParser() # 创建配置文件对象
conf.read("example.conf") # 读取配置文件



conf.write(open(
"filename.conf", "w")) # 配置文件对象写入文件

 

用Python生成这个文档:

import configparser

config
= configparser.ConfigParser()
config[
"DEFAULT"] = {'ServerAliveInterval': '45',
'Compression': 'yes',
'CompressionLevel': '9'}

config[
'bitbucket.org'] = {}
config[
'bitbucket.org']['User'] = 'hg'
config[
'topsecret.server.com'] = {}
topsecret
= config['topsecret.server.com']
topsecret[
'Host Port'] = '50022' # mutates the parser
topsecret['ForwardX11'] = 'no' # same here
config['DEFAULT']['ForwardX11'] = 'yes'
with open(
'example.ini', 'w') as configfile:
config.write(configfile)

“增,删,改”:

import ConfigParser

config
= ConfigParser.ConfigParser()
config.read(
'i.cfg')

# ########## 读 ##########
#
secs = config.sections()
#
print secs
#
options = config.options('group2')
#
print options

#item_list = config.items('group2')
#
print item_list

#val = config.get('group1','key')
#
val = config.getint('group1','key')

# ########## 改写 ##########
#
sec = config.remove_section('group1')
#
config.write(open('i.cfg', "w"))

#sec = config.has_section('wupeiqi')
#
sec = config.add_section('wupeiqi')
#
config.write(open('i.cfg', "w"))


#config.set('group2','k1',11111)
#
config.write(open('i.cfg', "w"))

#config.remove_option('group2','age')
#
config.write(open('i.cfg', "w"))

 

6、hashlib

加密相关操作,3.x里代替了md5和sha模块,提供 SHA1 , 224,256,384,512,MD5算法,MD5算法是hash散列表的一种实现,也是应用最广泛的一种

 hashlib,hash字符串转数字,字典就是用hash做的,字符串排序,存取速度快,

网站防篡改报警功能,定时wget网站首页,如果文件没有变更,MD5值不变

SHA1----MD5   越来越复杂,越来越安全,都是基于hash的

hmac消息加密速度比较快

中文需要 ("中文".encode(encoding="utf8"))    MD5的加密,其他SHA..一样的用法

import hashlib

# 先加hello, 再加world
m = hashlib.md5()
m.update(
"hello".encode("utf8"))
print(type("hello".encode("utf8"))) # <class 'bytes'>
m.update("world".encode("utf8"))
print(m.digest()) # MD5 二进制表示b'\xfc^\x03\x8d8\xa5p2\x08TA\xe7\xfep\x10\xb0'
print(m.hexdigest()) # 十六进制表示fc5e038d38a57032085441e7fe7010b0

# 直接helloworld
m1 = hashlib.md5()
m1.update(
"helloworld".encode("utf8"))
print(m.digest()) # b'\xfc^\x03\x8d8\xa5p2\x08TA\xe7\xfep\x10\xb0'
print(m.hexdigest()) # fc5e038d38a57032085441e7fe7010b0

还不够吊?python 还有一个 hmac 模块,它内部对我们创建 key 和 内容 再进行处理然后再加密

散列消息鉴别码,简称HMAC,是一种基于消息鉴别码MAC(Message Authentication Code)的鉴别机制。使用HMAC时,消息通讯的双方,通过验证消息中加入的鉴别密钥K来鉴别消息的真伪;

一般用于网络通信中消息加密,前提是双方先要约定好key,就像接头暗号一样,然后消息发送把用key把消息加密,接收方用key + 消息明文再加密,拿加密后的值 跟 发送者的相对比是否相等,这样就能验证消息的真实性,及发送者的合法性了。

Python学习第二阶段Day2(json/pickle)、 shelve、xml、PyYAML、configparser、hashlib模块Python学习第二阶段Day2(json/pickle)、 shelve、xml、PyYAML、configparser、hashlib模块
import hmac
h
= hmac.new('天王盖地虎'.encode("utf8"), '宝塔镇河妖'.encode("utf8"))
print (h.hexdigest())
View Code