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
<?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>
遍历等处理:
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文件:
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) # 打印生成的格
生成的xml内容:
<?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>
4.YAML
Python也可以很容易的处理ymal文档格式,只不过需要安装一个模块,参考文档:http://pyyaml.org/wiki/PyYAMLDocumentation
例如下面的格式
/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
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^x03x8d8xa5p2x08TAxe7xfepx10xb0' print(m.hexdigest()) # 十六进制表示fc5e038d38a57032085441e7fe7010b0 # 直接helloworld m1 = hashlib.md5() m1.update("helloworld".encode("utf8")) print(m.digest()) # b'xfc^x03x8d8xa5p2x08TAxe7xfepx10xb0' print(m.hexdigest()) # fc5e038d38a57032085441e7fe7010b0
还不够吊?python 还有一个 hmac 模块,它内部对我们创建 key 和 内容 再进行处理然后再加密
散列消息鉴别码,简称HMAC,是一种基于消息鉴别码MAC(Message Authentication Code)的鉴别机制。使用HMAC时,消息通讯的双方,通过验证消息中加入的鉴别密钥K来鉴别消息的真伪;
一般用于网络通信中消息加密,前提是双方先要约定好key,就像接头暗号一样,然后消息发送把用key把消息加密,接收方用key + 消息明文再加密,拿加密后的值 跟 发送者的相对比是否相等,这样就能验证消息的真实性,及发送者的合法性了。
import hmac h = hmac.new('天王盖地虎'.encode("utf8"), '宝塔镇河妖'.encode("utf8")) print (h.hexdigest())