Python - 通過PyYaml庫操作YAML文件


PyYaml簡單介紹

  • Python的PyYAML模塊是Python的YAML解析器和生成器
  • 它有個版本分水嶺,就是5.1

 

讀取YAML5.1之前的讀取方法

def read_yaml(self, path):
    with open(path, encoding="utf-8") as f:
        result = f.read()
        result = yaml.load(result)
        return result

當你運行的時候,會報一個Warning

 

讀取YAML 5.1之后的讀取方法

因為在5.1之后,直接用load()已經過時了,需要在方法里面加一個 loader 的請求參數,如下:

def read_yaml(self, path):
    with open(path, encoding="utf-8") as f:
         result = f.read()
         result = yaml.load(result, Loader=yaml.FullLoader) #loader可選擇BaseLoader、SafeLoader、FullLoader、UnsafeLoader
         return result

也可以,根據Python語法糖轉換,如下:

def read_yaml(self, path):
    with open(path, encoding="utf-8") as f:
        result = f.read()
        result = yaml.full_load(result)
        return result

針對不同的需要,加載器有如下幾種類型:

  1. BaseLoader:僅加載最基本的YAML
  2. SafeLoader:安全地加載YAML語言的子集。建議用於加載不受信任的輸入。(safe_load)
  3. FullLoader:加載完整的YAML語言。避免任意代碼執行。這是當前(PyYAML 5.1)默認加載器調用 yaml.load(input) (發出警告后)(full_load)
  4. UnsafeLoader(也稱為Loader向后兼容性):原始的Loader代碼,可以通過不受信任的數據輸入輕松利用。(unsafe_load) 

 

存儲數據到YAML的方法

with open(path, "w", encoding="utf-8") as f:
     yaml.dump(data, f, Dumper=yaml.SafeDumper) # 可選BaseDumper、SafeDumper 

 

 封裝成一個操作YAML的工具類

class YamlUtil:
    __instance = None

    def __new__(cls, *args, **kwargs):
        if not cls.__instance:
            print("YamlUtil first init")
            cls.__instance = super(YamlUtil, cls).__new__(cls, *args, **kwargs)
        return cls.__instance

    def read_yaml(self, path):
        with open(path, encoding="utf-8") as f:
            result = f.read()
            result = yaml.load(result, Loader=yaml.FullLoader)
            return result

    def write_yaml(self, path, data):
        with open(path, "w", encoding="utf-8") as f:
            yaml.dump(data, f, Dumper=yaml.SafeDumper)

yamlUtil = YamlUtil()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM