<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
使用庫 :import yaml
安裝:
pip install pyyaml
範例:
檔案config2.yml
guard_url : 'https://www.xxxx.com' app : chrome_files : 'C:Program FilesGoogleChromeApplicationchrome.exe' networkTime : 30 title : '公司'
讀取yml資料
def read_yml(file): """讀取yml,傳入檔案路徑file""" f = open(file,'r',encoding="utf-8") # 讀取檔案 yml_config = yaml.load(f,Loader=yaml.FullLoader) # Loader為了更加安全 """Loader的幾種載入方式 BaseLoader - -僅載入最基本的YAML SafeLoader - -安全地載入YAML語言的子集。建議用於載入不受信任的輸入。 FullLoader - -載入完整的YAML語言。避免任意程式碼執行。這是當前(PyYAML5.1)預設載入器呼叫yaml.load(input)(發出警告後)。 UnsafeLoader - -(也稱為Loader向後相容性)原始的Loader程式碼,可以通過不受信任的資料輸入輕鬆利用。""" return yml_config
列印yml內容
yml_info=read_yml('config.yml') print(yml_info['guard_url']) print(yml_info['app']) print((yml_info['app'])['chrome_files']) """ https:xxxx.com {'chrome_files': 'C:\Program Files\Google\Chrome\Application\chrome.exe'} C:Program FilesGoogleChromeApplicationchrome.exe """
插入到yml資料
def write_yml(file,data): # 寫入資料: with open(file, "a",encoding='utf-8') as f: # data資料中有漢字時,加上:encoding='utf-8',allow_unicode=True f.write('n') # 插入到下一行 yaml.dump(data, f, encoding='utf-8', allow_unicode=True) data = {"S_data": {"test1": "hello"}, "Sdata2": {"name": "漢字"}} write_yml('config2.yml',data=data)
邏輯是完整讀取然後更新數值後在完整寫入。
def read_yml(file): """讀取yml,傳入檔案路徑file""" f = open(file, 'r', encoding="utf-8") # 讀取檔案 yml_config = yaml.load(f, Loader=yaml.FullLoader) # Loader為了更加安全 return yml_config def updata_yaml(file): """更新yml的數值""" old_data=read_yml(file) #讀取檔案資料 old_data['title']='仔仔大哥哥' #修改讀取的資料( with open(file, "w", encoding="utf-8") as f: yaml.dump(old_data,f,encoding='utf-8', allow_unicode=True) updata_yaml('config2.yml')
使用庫 :import xml
安裝:系統自帶
範例:
如果只是組態檔儘量使用yml來讀寫,
讀取xml檔案:
config.xml
<config> <id>905594711349653</id> <sec>0tn1jeerioj4x6lcugdd8xmzvm6w42tp</sec> </config>
import xml.dom.minidom dom = xml.dom.minidom.parse('config.xml') root = dom.documentElement def xml(suser): suser = root.getElementsByTagName(suser) return suser[0].firstChild.data id = xml('id') # 程序名 print("列印ID:"+id) """ 列印ID:905594711349653 """
進階country_data.xml
<?xml version="1.0"?> <data> <country name="Liechtenstein"> <rank>1</rank> <year>2008</year> <gdppc>141100</gdppc> <neighbor name="Austria" direction="E"/> <neighbor name="Switzerland" direction="W"/> </country> <country name="Singapore"> <rank>4</rank> <year>2011</year> <gdppc>59900</gdppc> <neighbor name="Malaysia" direction="N"/> </country> <country name="Panama"> <rank>68</rank> <year>2011</year> <gdppc>13600</gdppc> <neighbor name="Costa Rica" direction="W"/> <neighbor name="Colombia" direction="E"/> </country> </data>
這裡產生的 root 是一個 Element 物件,代表 XML 的根節點,每一個 Element 物件都有 tag 與 attrib 兩個屬性:
import xml.etree.ElementTree as ET # 從檔案載入並解析 XML 資料 tree = ET.parse('country_data.xml') root = tree.getroot() print(root.tag) # 列印根節點名稱 print(root.attrib) # 列印根節點屬性 # for 迴圈可以列出所有的子節點: # 子節點與屬性 for child in root: print(child.tag, child.attrib) """ data {} # data 沒有屬性所以返回空 country {'name': 'Liechtenstein'} country {'name': 'Singapore'} country {'name': 'Panama'} """
也可以使用索引的方式存取任意的節點,透過 text 屬性即可取得節點的內容:
print(root[0][1].text) """ 2008 """
可透過 get 直接取得指定的屬性值:
# 取得指定的屬性值 print(root[0][3].get('name')) """ Austria """
iter 可以在指定節點之下,以遞迴方式搜尋所有子節點:
# 搜尋所有子節點 for neighbor in root.iter('neighbor'): print(neighbor.attrib) """ {'name': 'Austria', 'direction': 'E'} {'name': 'Switzerland', 'direction': 'W'} {'name': 'Malaysia', 'direction': 'N'} {'name': 'Costa Rica', 'direction': 'W'} {'name': 'Colombia', 'direction': 'E'} """
findall 與 find 則是隻從第一層子節點中搜尋(不包含第二層以下),findall 會傳回所有結果,而 find 則是隻傳回第一個找到的節點:
# 只從第一層子節點中搜尋,傳回所有找到的節點 for country in root.findall('country'): # 只從第一層子節點中搜尋,傳回第一個找到的節點 rank = country.find('rank').text # 取得節點指定屬性質 name = country.get('name') print(name, rank) """ Liechtenstein 1 Singapore 4 Panama 68 """
XML 節點的資料可以透過 Element.text 來修改,而屬性值則可以使用 Element.set() 來指定,若要將修改的結果寫入 XML 檔案,則可使用 ElementTree.write():
# 尋找 rank 節點 for rank in root.iter('rank'): # 將 rank 的數值加 1 new_rank = int(rank.text) + 1 # 設定新的 rank 值 rank.text = str(new_rank) # 增加一個 updated 屬性值 rank.set('updated', 'yes') # 寫入 XML 檔案 tree.write('output.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 的節點,可以使用 Element.remove():
# 在第一層子節點鐘尋找 country 節點 for country in root.findall('country'): # 取得 rank 數值 rank = int(country.find('rank').text) # 若 rank 大於 50,則移除此節點 if rank > 50: root.remove(country) # 寫入 XML 檔案 tree.write('output.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> </data>
若要建立一個全新的 XML 結構,可以使用 Element 建立根節點,再以 SubElement() 加入子節點:
# 建立新的 XML 結構 orders = ET.Element('orders') # 新增節點 order1 = ET.SubElement(orders, 'order') order1.text = "My Order 1" order1.set("new", "yes") # 新增節點 order2 = ET.SubElement(orders, 'order') order2.text = "My Order 2" order2.set("new", "no") # 輸出 XML 原始資料 ET.dump(orders) <orders><order new="yes">My Order 1</order><order new="no">My Order 2</order></orders>
XPath 可以讓使用者在 XML 結構中以較複雜的條件進行搜尋,以下是一些常見的範例。
# 頂層節點 root.findall(".") # 尋找「頂層節點 => country => neighbor」這樣結構的節點 root.findall("./country/neighbor") # 尋找 name 屬性為 Singapore,且含有 year 子節點的節點 root.findall(".//year/..[@name='Singapore']") # 尋找父節點 name 屬性為 Singapore 的 year 節點 root.findall(".//*[@name='Singapore']/year") # 尋找在同一層 neighbor 節點中排在第二位的那一個 root.findall(".//neighbor[2]")
若要對一般的 XML 檔案內容進行自動排版,可以使用 lxml 模組的 etree:
import lxml.etree as etree # 讀取 XML 檔案 root = etree.parse("country_data.xml") # 輸出排版的 XML 資料 print(etree.tostring(root, pretty_print=True, encoding="unicode")) # 將排版的 XML 資料寫入檔案 root.write("pretty_print.xml", encoding="utf-8")
到此這篇關於python-yml檔案讀寫與xml檔案讀寫的文章就介紹到這了,更多相關 python檔案讀寫內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45