Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用python从字典中编写yaml文件?_Python_Python 3.x_Python 2.7_Yaml_Pyyaml - Fatal编程技术网

如何使用python从字典中编写yaml文件?

如何使用python从字典中编写yaml文件?,python,python-3.x,python-2.7,yaml,pyyaml,Python,Python 3.x,Python 2.7,Yaml,Pyyaml,我有一个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 - - --- 如果我手动创建这些,我

我有一个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()获得所需的输出。

首先,您应该使用
dump()
dump_all()
,因为您要编写yaml,而不是使用
load()

您还应该注意到,CSV阅读器在Python 2.7上返回的内容与在Python 3.6上的有所不同:第一个是从
CSV\u dict列表
返回的
列表
,第二个是
列表
列表
。这本身不会是一个问题,但PyYAML转储一个带有已排序键的dict,以及一个带有标记的orderedict

您建议的YAML也无效,因为行中的流样式映射为:

 key5: {key6: [value6]
如果在文档结尾之前未以
}
终止,则您也不能:

key9: value9
  -
  - 
或使用:

key9: value9
key10:
  -
  -

或者类似的东西(也没有等效的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

在Python2.7和Python3.6这两个版本上,谷歌搜索你的标题让我第一次看到了这一点,因此,如果这在某种程度上是不够的,请描述原因,谢谢。我想这就是我被卡住的地方。我已经创建了字典,但是我如何读入它,而不是手动指定字典行并允许它在字典中迭代?那么,请发布到目前为止的代码,以便我们可以查看。链接的dup向您展示了如何转储一个字典,还有一个
dump_all()
方法,它获取一个字典列表。上面以“示例代码”的形式发布,
yaml_值
类似于
[0]={key1:val1}[1]={key1:val1}
等等,您可能需要类似于
toYAML(yaml_值[0]--“toYAML”的东西(yaml_values[1])
在一个文件中,正如您在示例数据中指出的那样?谢谢!我看到了ruamel.yaml;但是,没有尝试将其作为解决方案。事实上,这非常有效。我正在寻求帮助的一个观察结果是输出实际上看起来像:
“\uFEFFkey1”:value\u b1键2:value\u b2键3:-key4:value\u b4键5:{key6:[value_b6]}key7:value\u b7''key8:value\u b8 key9:value\u b9
\uFEFF
。根据Python的版本和打开文件的方式,可能不会在打开时剥离。我想稍微改变输出格式,但无法从文档页面使其正常工作。如果您能提供帮助,那将非常棒。查找
>key1:value\u a1/n key2:value\u a2/n key3:/n-key4:value\u a4/n key5:/n key6:/n-value\u a6/n key7:value\u a7/n key8:value\u a8/n key9:value\u a9
/n=newline,无法在新注释窗口中正确运行我不知道您期望什么,尽量不要滥用注释(后续)问题。您应该发布一个新的后续问题,并对您想要的输出进行正确的格式设置。请参考此问题,即您拥有的代码。如果您标记它,我将自动收到通知
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