[英]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.