常用模塊(三)——shelve、xml、hashlib、configparser
常用模塊(三)
一、shelve模塊
1、shelve模塊也是一種序列化模塊,內部使用的是pickle模塊,所以也存在跨平臺性差的問題
2、特點:
只要提供一個文件名即可
讀寫的方式和字典一樣
將數據以類似字典的形式在文件中讀寫
3、應用場景
在單擊的程序中使用
4、使用方法
(1)序列化
1 import shelve 2 3 s1= shelve.open(‘a.txt‘) # 打開文件 4 s1[‘week‘]=["Sun", "Mon", "Tues", "Wed", "Thur", "Fri", "Sat"] 5 s1[‘person‘]={"name": "Zero", "age": 8, "height": 180} # 寫操作 6 s1.close() # 關閉文件
(2)反序列化
1 import shelve 2 3 s2 = shelve.open(‘a.txt‘) # 打開文件 4 print(s2.get(‘week‘)) 5 print(s2.get(‘person‘)) 6 print(s2.get(‘person‘)[‘age‘]) # 讀取文件中內容 7 s2.close() # 關閉文件
二、xml模塊
1、XML全稱:可擴展標記語言,標記指的是代表某種含義的字符 XML<>
2、為什麽要用xml
(1)為能夠在不同的平臺間繼續數據的交換
(2)為了使交換的數據能讓對方看懂,就需要按照一定的語法規範來書寫
3、語法格式
(1)任何的起始標簽都必須有一個結束標簽。
<tagname></tagname>
<tagname></tagname>
<tagname/> 簡化寫法
(2)可以采用另一種簡化語法,可以在一個標簽中同時表示起始和結束標簽。這種語法是在大於符號之前緊跟一個斜線(/)。
例如<ABC/>:XML解析器會將其翻譯成<ABC></ABC>。
(3)標簽必須按合適的順序進行嵌套,所以結束標簽必須按鏡像順序匹配起始標簽,這好比是將起始和結束標簽看作是數學中的左右括號:在沒有關閉所有的內部括號之前,是不 能關閉外面的括號的。
1 <tag1> 2 <tag2> 3 <tag3> 4 </tag3> 5 </tag2> 6 </tag1>
(4)所有的特性都必須有值。
特性指的是屬性
1 <person name="aaa"> 2 </person>
(5)所有的特性都必須在值的周圍加上雙引號。
4、註意點
(1)最外層有且只有一個標簽,這個標簽為根標簽
(2)第一行應該有文檔聲明,用於高速計算機怎麽理解
例如:<?xml version="1.0" encoding="utf-8"?>
1 <person> 2 <sut1> 3 </stu1> 4 <sut2> 5 </stu2> 6 </person>標簽嵌套
5、使用場景:
(1)配置文件
(2)常規的數據交換。 例如從服務器獲取一段新聞
6、方法及屬性
(1).ElementTree 表示整個文件的元素樹 (2.)Element 表示一個節點 a.屬性 text 開始標簽和結束標簽中間的文本 attrib 所有的屬性 字典類型 tag 標簽的名字 b.方法 get 獲取某個屬性的值 1.解析XML 查找標簽 find 在子標簽中獲取名字匹配第一個 findall 在子標簽中獲取名字匹配的所有標簽 iter(tagname) 在全文中查找[匹配的所有標簽 返回一個叠代器 2.生成XML 用ElmentTree parse() 解析一個文件 getroot() 獲取根標簽 write() 寫入到文件 3.修改xml set 一個屬性 remove 一個標簽 append 一個標簽
1 import xml.etree.ElementTree as et 2 3 # 讀取xml文檔到內存中 得到一個包含所有數據的節點樹 4 # 每一個標簽就稱之為一個節點 或 元素 5 tree = et.parse("text.xml") 6 7 # 獲取根標簽 8 root = tree.getroot() 9 10 # 獲取所有的country 11 print(root.find("country")) # 找的是第一個 12 print(root.findall("country")) # 找的是所有 13 14 # 獲取字標簽 15 print(root.iter("country")) 16 for i in root.iter("country"): 17 print(i) 18 19 # 遍歷整個xml 20 for country in root: 21 print(country.tag,country.attrib,country.text) 22 for t in country: 23 print(t.tag, t.attrib, t.text) 24 25 print(root.find("country").get("name"))遍歷
7、增刪改查
1.解析XML 查找標簽 find 在子標簽中獲取名字匹配第一個 findall 在子標簽中獲取名字匹配的所有標簽 iter(tagname) 在全文中查找[匹配的所有標簽 返回一個叠代器 2.生成XML 用ElmentTree parse() 解析一個文件 getroot() 獲取根標簽 write() 寫入到文件 3.修改xml set 一個屬性 remove 一個標簽 append 一個標簽
1 # 讀取到內存 2 tree = et.parse("text.xml") 3 for country in tree.findall("country"): 4 yeartag = country.find("year") 5 yeartag.text = str(int(yeartag.text) + 1) 修改標簽文本 6 7 country.remove(country.find("year")) 刪除標簽 8 9 # 添加子標簽 10 newtag = et.Element("newTag") 11 # 文本 12 newtag.text = "123" 13 #屬性 14 newtag.attrib["name"] = "DSB" 15 #添加 16 country.append(newtag) 17 18 # 寫回到內存 19 tree.write("text.xml",encoding="utf-8",xml_declaration=False)增刪改查
8、生成xml文檔
1 import xml.etree.ElementTree as et 2 # 創建根標簽 3 root = et.Element("root") 4 # 創建節點樹 5 t1 = et.ElementTree(root) 6 7 # 加一個peron標簽 8 persson = et.Element("person") 9 persson.attrib["name"] = "yyh" 10 persson.attrib["sex"] = "man" 11 persson.attrib["age"] = "20" 12 persson.text = "這是一個person標簽" 13 14 root.append(persson) 15 16 # 寫入文件 17 t1.write("newXML.xml",encoding="utf-8",xml_declaration=True)生成
三、hashlib模塊
1、hashlib分為hash和library
(1)hash
①.hash為一種算法,用於將任意長度的數據壓縮映射到一段固定長度的字符 (提取特征)
②.特點
a.輸入數據不同,得到的hash值有可能相同
b.不能通過hash值來得到輸入的值
c.如果算法相同,無論輸入的數據長度是多少,得到的hash值長度相同
③.作用
常用的提升安全性的手段,用於數據的加密,MD5是常用的一種hash算法
(2)library
2、利用hashlib加密
1 import hashlib 2 md = hashlib.md5() 3 md.update("hello".encode("utf-8")) 4 print(md.hexdigest())加密
3、解密
破解MD5可以嘗試撞庫
原理: 有一個數據庫裏面存放了常見的明文和密文的對應關系
四、configparser模塊
1、configparser模塊是配置文件解析模塊,用於提供程序運行所需要的一些信息的文件。 後綴 .ini,.cfg
2、配置文件內容格式
只包括兩種元素:
section 分區
option 選項
一個文件可以有多個section
一個section可以有多個選項
3、核心方法
sections() 獲取所有分區
options() 獲取所有選項
get(section,option) 獲取一個值
4、配置文件
1 import configparser 2 3 # 得到配置文件對象 4 cfg = configparser.ConfigParser() 5 6 # 讀取一個配置文件 7 cfg.read("download.ini") 8 9 print(cfg.sections()) 10 print(cfg.options("section1")) 11 12 print((cfg.get("section1","maxspeed"))) 13 print((cfg.getint("section1","maxspeed"))) 14 print(cfg.getint("section2","minspeed")) 15 16 17 # 修改最大速度為2048 18 cfg.set("section1","maxspeed","2048") 19 20 # 修改後寫入文件 21 cfg.write(open("download.ini","w",encoding="utf-8"))配置文件
常用模塊(三)——shelve、xml、hashlib、configparser