簡體   English   中英

如何使用python從字典中寫入Yaml文件?

[英]How do I write a yaml file from a dictionary with python?

我有一個csv文件,其中包含數據,其中標頭包含鍵,單元格包含值。 我想使用python從csv文件的內容創建一個yaml文件。

我創建了K:V對的字典; 但是,我一直試圖將K:V對放入yaml文件中。

yaml的結構必須為:

key1: value1
key2: value2
key3:
  -  key4: value4
     key5: {key6: [value6]
key7: value7
key8: value8
key9: value9
  -
  -
---

如果要手動創建它們,則將有1000多個YAML,因此這非常耗時且不切實際。

我正在尋找經驗豐富的人可能擁有的任何想法。

我真的很想讓輸出遍歷字典,以創建一個龐大的YAML列表,如下所示:

key1: value1
key2: value2
key3:
  -  key4: value4
     key5: {key6: [value6]
key7: value7
key8: value8
key9: value9
  -
  -
---
key1: value1
key2: value2
key3:
  -  key4: value4
     key5: {key6: [value6]
key7: value7
key8: value8
key9: value9
  -
  -
---
key1: value1
key2: value2
key3:
  -  key4: value4
     key5: {key6: [value6]
key7: value7
key8: value8
key9: value9
  -
  -
---
key1: value1
key2: value2
key3:
  -  key4: value4
     key5: {key6: [value6]
key7: value7
key8: value8
key9: value9
  -
  -
---

樣例代碼:

import csv
import yaml

def csv_dict_list(variables_file) :

    reader=csv.DictReader(open(variables_file, 'r'))
    dict_list = []
    for line in reader:
        dict_list.append(line)
    return dict_list

yaml_values = csv_dict_list(sys.argv[1])

無論我在此之后嘗試什么,都無法使用yaml.load()或yaml.load_all()獲得所需的輸出。

首先,由於要編寫YAML,因此應使用dump()dump_all() ,而不要使用load()

您還應該注意,CSV閱讀器在Python 2.7和Python 3.6上確實返回了不同的內容:第一個從csv_dict_list返回dict list ,第二個從OrderedDict list 這樣做本身不會有問題,但是PyYAML會轉儲帶有排序鍵的字典,以及帶標簽的ordereddict。

您提議的YAML也是無效的,因為該行中的流樣式映射:

 key5: {key6: [value6]

在文檔末尾沒有以}終止,您還不能:

key9: value9
  -
  - 

可以使用:

key9: value9
key10:
  -
  -

要么

key9: 
  - value9
  -

或類似的內容(也沒有等效的Python數據結構同時具有一個鍵和一個鍵的值和列表,因此即使在Python中也無法創建類似的數據)。

PyYAML另外還缺少縮進樣式塊序列的支持。 如果您這樣做:

import yaml
print(yaml.dump(dict(x=[dict(a=1, b=2)]), indent=4))

輸出仍將向左刷新:

x:
- {a: 1, b: 2}

為了防止使用PyYAML時遇到所有這些問題,並避免Python版本之間的差異,我建議您使用ruamel.yaml(免責聲明:我是該軟件包的作者)和以下代碼:

import sys
import csv
import ruamel.yaml

Dict = ruamel.yaml.comments.CommentedMap

def csv_dict_list(variables_file) :
    reader=csv.reader(open(variables_file, 'r'))
    key_list = None
    dict_list = []
    for line in reader:
        if key_list is None:
            key_list = line
            continue
        d = Dict()
        for idx, v in enumerate(line):
            k = key_list[idx]
            # special handling of key3/key4/key5/key6
            if k == key_list[2]:
                d[k] = []
            elif k == key_list[3]:
                d[key_list[2]].append(Dict([(k, v)]))
            elif k == key_list[4]:
                d[key_list[2]][0][k] = dt = Dict()
                dt.fa.set_flow_style()
            elif k == key_list[5]:
                d[key_list[2]][0][key_list[4]][k] = [v]
            else:
                d[k] = v
        dict_list.append(d)
    return dict_list

data = csv_dict_list('test.csv')


yaml = ruamel.yaml.YAML()
yaml.indent(sequence=4, offset=2)
yaml.dump_all(data, sys.stdout)

test.csv

key1,key2,key3,key4,key5,key6,key7,key8,key9
value_a1,value_a2,value_a3,value_a4,value_a5,value_a6,value_a7,value_a8,value_a9
value_b1,value_b2,value_b3,value_b4,value_b5,value_b6,value_b7,value_b8,value_b9

這給出了:

key1: value_a1
key2: value_a2
key3:
  - key4: value_a4
    key5: {key6: [value_a6]}
key7: value_a7
key8: value_a8
key9: value_a9
---
key1: value_b1
key2: value_b2
key3:
  - key4: value_b4
    key5: {key6: [value_b6]}
key7: value_b7
key8: value_b8
key9: value_b9

在python 2.7和python 3.6上

暫無
暫無

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

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