""" pickle 和 shevle 序列化後獲得的數據 只有python才能解析 一般企業開發不可能作一個單機程序 都須要聯網進行計算機間的交互 咱們必須保證這個數據 可以跨平臺使用 JSON是什麼? java script object notation 就是的對象表示法 var obj = {"name":"egon"} 對於咱們開發而言 json就是一種通用的數據格式 任何語言都能解析 js 中的數據類型 python數據類型 的對應關係 {} 字典 [] list string "" str int/float int/float true/false True/False null None json格式的語法規範 最外層一般是一個字典或列表 {} or [] 只要你想寫一個json格式的數據 那麼最外層直接寫{} 字符串必須是雙引號 你能夠在裏面套任意多的層次 json模塊的核心功能 dump load dumps loads 不帶s 封裝write 和 read"""import jsonusers = {'name':"音樂會","age":20,"hobbies":("music","movies")}# res1= json.dumps(users)# print(res1)# res=json.dump(users,open("users.json","wt",encoding="utf-8"))# print(res)# json的反序列化# jsonstr = json.load(open("users.json","r",encoding="utf-8"))# print(jsonstr,type(jsonstr))## with open("users.json","rt",encoding="utf-8") as f:# jsonstr1 = json.loads(f.read())# print(jsonstr1,type(jsonstr1))mydic = { "users": [{ "name": "agon", "age": 68 }, { "name": "agon", "age": 68 } ]}# with open("b.json","wt",encoding="utf-8") as f:# f.write(json.dumps(mydic))# with open("b.json", "wt", encoding="utf-8") as f:# json.dump(mydic, f)# =================================='''pickle 一種python獨有的序列化方式 支持python中全部的類型 dump load dumps loads'''# ===================================='''shelve 一種python獨有的序列化方式 進行了進一步封裝 只有一個open函數 獲得一個shevle對象後 直接把它當成一個字典 經過key來存取 它於pickle不一樣之處在於 不須要關心文件模式什麼的 直接把它當成一個字典來看待 它能夠直接對數據進行修改 而不用覆蓋原來的數據 而pickle 你想要修改只能 用wb模式來覆蓋'''import shelve# user = {"name":"高根"}# s = shelve-egon.open("userdb.shv")# s["user"] = user# s.close()# s = shelve.open("userdb.shv",writeback=True)# print(s["user"])# s["user"]["age"] = 20# s.close()# ==============================''' 與json的區別 XML相比較 更加劇量級(貶義詞) 一樣的數據 xml格式佔用更多空間 最要命 解析很是麻煩 你須要知道xml究竟是什麼結構 更多的是編寫(照着模板填空) 解析的工做 一般框架已經作好了XML 什麼XML:全稱 可擴展標記語言 標記指的是表明某種含義的字符 XML<> 爲何須要XML 爲可以在不一樣的平臺間繼續數據的交換 爲了使交換的數據能讓對方看懂 就須要按照必定的語法規範來書寫 XML語法格式: 1、任何的起始標籤都必須有一個結束標籤。 <tagname></tagname> <tagname></tagname> <tagname/> 簡化寫法 2、能夠採用另外一種簡化語法,能夠在一個標籤中同時表示起始和結束標籤。 這種語法是在大於符號以前緊跟一個斜線(/),例如<百度百科詞條/>。 XML解析器會將其翻譯成<百度百科詞條></百度百科詞條>。 3、標籤必須按合適的順序進行嵌套,因此結束標籤必須按鏡像順序匹配起始標籤,例如這是一串百度百科中的樣例字符串。這比如是將起始和結束標籤看做是數學中的左右括號:在沒有關閉全部的內部括號以前,是不能關閉外面的括號的。 <tag1> <tag2> <tag3> </tag3> </tag2> </tag1> 大白話 關閉標籤應該從內往外 一層一層關閉 順序不能亂 4、全部的特性都必須有值。 特性指的是屬性 <person name=""> </person> 5、全部的特性都必須在值的周圍加上雙引號。 注意:最外層有且只有一個標籤 這個標籤稱之爲根標籤 第一行應該有文檔聲明 用於高速計算機怎麼理解 例如:<?xml version="1.0" encoding="utf-8"?> 當標籤嵌套的時候會出現層級關係 若是一個標籤不被任何別的標籤包裹 那他就是根標籤(最外層) 使用場景: 1.配置文件 2.常規的數據交換 例如從服務器獲取一段新聞 與json的區別: 做用是同樣的 都是一種數據格式 xml比json先誕生 json的數據比xml小 目前json是主流 python中的xml處理 使用到的模塊 ElmentTree 表示整個文件的元素樹 Elment 表示一個節點 屬性 1.text 開始標籤和結束標籤中間的文本 2.attrib 全部的屬性 字典類型 3.tag 標籤的名字 方法 get 獲取某個屬性的值 1.解析XML 查找標籤 find 在子標籤中獲取名字匹配第一個 findall 在子標籤中獲取名字匹配的全部標籤 iter(tagname) 在全文中查找[匹配的全部標籤 返回一個迭代器 2.生成XML 用ElmentTree parse() 解析一個文件 getroot() 獲取根標籤 write() 寫入到文件 3.修改xml set 一個屬性 remove 一個標籤 append 一個標籤'''import xml.etree.ElementTree as ElementTree# 解析d.xml-egontree = ElementTree.parse("d.xml")# print(tree)# 獲取根標籤rootTree = tree.getroot()# 三種獲取標籤的方式# 獲取全部人的年齡 iter是用於在全文範圍獲取標籤# for item in rootTree.iter("age"):# # 一個標籤三個組成部分# print(item.tag) # 標籤名稱# print(item.attrib) # 標籤的屬性# print(item.text) # 文本內容# 第二種 從當前標籤的子標籤中找到一個名稱爲age的標籤 若是有多個 找到的是第一個# print(rootTree.find("age").attrib)# 第三種 從當前標籤的子標籤中找到全部名稱爲age的標籤# print(rootTree.findall("age"))# 獲取單個屬性# stu = rootTree.find("stu")# print(stu.get("age"))# print(stu.get("name"))# 刪除子標籤# rootTree.remove(stu)# 添加子標籤# 要先建立一個子標籤# newTag = ElementTree.Element("這是新標籤",{"一個屬性":"值"})# rootTree.append(newTag)# 寫入文件# tree.write("f.xml",encoding="utf-8")""" 用代碼生成一個xml文檔import xml.etree.ElementTree as et# 建立根標籤root = et.Element("root")# 建立節點樹t1 = et.ElementTree(root)# 加一個peron標籤persson = et.Element("person")persson.attrib["name"] = "yyh"persson.attrib["sex"] = "man"persson.attrib["age"] = "20"persson.text = "這是一個person標籤"root.append(persson)# 寫入文件t1.write("newXML.xml",encoding="utf-8",xml_declaration=True)"""# ==============================='''configparserconfigparser 是什麼? 配置文件解析模塊 什麼是配置文件? 用於提供程序運行所須要的一些信息的文件 後綴 ini cfg 配置信息 一般是 須要更改可是不須要常常改的值 有什麼用? 方便用戶修改 例如超時時間配置文件內容格式 只包括兩種元素 section 分區 option 選項 一個文件能夠有多個section 一個section能夠有多個選項核心功能 1.sections 獲取全部分區 2.options 獲取全部選項 3.get 獲取一個值 傳入 section option 注意:大小寫不敏感經常使用功能: read 讀取一個配置文件 write 寫入到文件中 get 獲取某個分區下 某個選項的值 set 修改 或增長選項 remove_section 刪除分區 remove_option 刪除選項 add_section 添加分區'''# 僞裝作一個下載功能 最大連接速度能夠由用戶來控制 用戶不會看代碼 因此提供一個配置文件import configparser# 獲得配置文件對象cfg = configparser.ConfigParser()# 讀取一個配置文件cfg.read("download.ini")# 獲取須要的信息# 獲取全部分區# print(cfg.sections())# 獲取全部選項# print(cfg.options("section1"))# 獲取某個選項的值# print(type(cfg.get("section1","maxspeed")))# get返回的都是字符串類型# 若是須要轉換類型 直接使用get+對應的類型(bool int float)# print(type(cfg.getint("section1","maxspeed")))# print(cfg.getint("section2","minspeed"))# 是否由某個選項# config.has_option()# 是否由某個分區# config.has_section()# 不太經常使用的# 添加# config.add_section("server")# config.set("server","url","192.168.1.2")# 刪除# config.remove_option("user","age")# 修改# config.set("server","url","192.168.1.2")# 寫回文件中# with open("test.cfg", "wt", encoding="utf-8") as f:# config.write(f)