簡體   English   中英

如何在字典 <> yaml 序列化后用單引號括起 yaml 的值

[英]How to encase the value of a yaml in single quotes after a dictionary <> yaml serialization

我想將我的字典轉換為 YAML 文檔,其中的鍵不帶引號,但值用單引號引起來。

我找到了幾種將鍵和值都包含在單引號中的解決方案,但這不是我想要的。 您可以在下面看到一個示例腳本:

import yaml

theDict = {'this' : {'is': 'the', 'main': 12,'problem':'see?' }}

print(yaml.dump(theDict, default_flow_style=False, sort_keys=False))

這將是 output:

this:
    is: the
    main: 12
    problem: see?

但是,我想要:

this:
  is: 'the'
  main: '12'
  problem: 'see?'

我不想:

this:
  'is': 'the'
  'main': '12'
  'problem': 'see?'

我也不想要:

'this':
  'is': 'the'
  'main': '12'
  'problem': 'see?'

被標記為重復的答案不是重復的,因為問題需要將鍵和值都用引號引起來。 這不是我想做的。 我希望發生 yaml 的序列化,然后將值(不是鍵)包含在引號中。

我知道 YAML 庫中 Python 的代表沒有獲取上下文信息,因此區分正在轉儲的標量、鍵標量和值標量並非易事。

您應該做的是創建一個 class ,它的行為類似於字符串,但使用單引號顯式轉儲。 這可以在 PyYAML 中完成,但我建議您升級到我的 ruamel.yaml,它不僅內置了此功能(因此它可以在往返 YAML 文檔時保留引號),而且還實現了 YAML 1.2 標准發布在 2009 年,PyYAML 實現了舊的 YAML 1.1 標准,但有一些額外的限制。

在這兩種情況下(升級與否),這意味着您需要在創建數據結構時或通過(遞歸地)遍歷數據結構更新值,然后在轉儲之前顯式指示那些應該用單引號引起來的元素。

我在創建過程中這樣做:

import sys
import ruamel.yaml

S = ruamel.yaml.scalarstring.SingleQuotedScalarString

theDict = {'this' : {'is': S('the'), 'main': S(12),'problem':S('see?') }}

    
yaml = ruamel.yaml.YAML()
yaml.dump(theDict, sys.stdout)

這使:

this:
  is: 'the'
  main: '12'
  problem: 'see?'

但這將使您的12在 Python 代碼中表現得像一個字符串。 如果這是不可取的,您需要在轉儲之前進行轉換,或者創建一個額外的int子類作為SingleQuotedScalarString轉儲(這種混合在ruamel.yaml中不可用)


順便說一句:使用 PyYAML 時,你不應該養成編碼的習慣:

print(yaml.dump(data, ...))

這為 output 創建了一個不必要的 memory 緩沖區,然后將其流出並丟棄該緩沖區。 而是直接 stream 到sys.stdout ,這樣速度更快(並且在轉儲大型數據結構時出現 memory 錯誤的可能性要小得多):

yaml.dump(data, stdout, ...)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM