別的之前:從未如果你使用yaml.load()
不必,因爲這樣做原則上是不安全的。對於這種簡單的結構(無標籤),您應該使用yaml.safe_load()
(以及相應的safe_dump()
,如果轉儲後無法安全地加載數據,則會投訴。
yaml.dump()
具有以下特徵:
def dump(documents, stream=None, Dumper=Dumper,
default_style=None, default_flow_style=None,
canonical=None, indent=None, width=None,
allow_unicode=None, line_break=None,
encoding='utf-8', explicit_start=None, explicit_end=None,
version=None, tags=None)
這一點只有第一個需要給予,這應該是你的doc
變量。如果不指定流,則dump()
將數據結構寫入內存文件對象(如StringIO),並在寫入之後將值作爲字符串返回。
因此,儘管你可以這樣做:
with open("file_to_edit.yaml", 'w') as f:
f.write(yaml.safe_dump(doc))
這是低效的,並說明如何yaml.safe_dump()
作品知之甚少。
如果要打開文件進行讀寫,則必須確保重置文件和中的索引並截斷其內容。這通常是不值得的努力,以便更安全重新打開文件進行寫入:
def set_state(state):
file_name = "file_to_edit.yaml"
with open(file_name) as f:
doc = yaml.safe_load(f)
doc['state'] = state
with open(file_name, 'w') as f:
yaml.safe_dump(doc, f, default_flow_style=False)
(當然你做文件名的變量時,你要確保你覆蓋原來的,所以你不能錯打它)。
如果不指定default_flow_style=False
,你的輸出就會是這樣的:
{state: deleted}
輸出將不包括周圍present
多餘的報價在你的輸入。您也可以指定default_style="'"
,但這也會引起state
左右的報價。
如果失去引號是一個問題,你真的希望輸出看起來像輸入,你應該使用ruamel.yaml
(免責聲明我是該包的作者),它可以保留單個字符串的引號,處理YAML 1.2(而不是YAML 1.1),並保留文件中的註釋。
你是否收到某種錯誤? – usr2564301
不,它只是沒有改變任何東西 –
它只是似乎沒有寫入文件出於某種原因 –