我有一个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格式的数据到文件中?,谷歌搜索您的标题使我成为第一个匹配项,因此,如果某种方式不够用,请描述原因,谢谢。

我猜那就是我被困住的地方。 我已经创建了字典,但是如何读入而不是手动指定字典行并允许其遍历字典呢?

然后,请发布您到目前为止的代码,以便我们进行研究。 链接的dup向您展示了如何转储一本字典,还有dump_all()方法采用了字典列表。

上面以"示例代码"发布

因此,yaml_values是类似[0] = {key1: val1}, [1] = {key1: val1}的东西,而您想要在单个文件中像toYAML(yaml_values[0]) --- toYAML(yaml_values[1])这样的东西,就像您在样本数据中指出的那样?

是的,完全正确

首先,由于要编写YAML,因此应使用dump()或dump_all(),而不要使用load()。

您还应该注意,CSV阅读器确实会在Python 2.7上返回不同的内容,例如在Python 3.6上:第一个从csv_dict_list返回list的dict,第二个是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上

谢谢! 我看过ruamel.yaml; 但是,还没有尝试过将其作为解决方案。 实际上,这很好。 我正在寻求帮助的一个观察结果是输出实际上看起来像:"\uFEFFkey1": value_b1 key2: value_b2 key3: - key4: value_b4 key5: {key6: [value_b6]} key7: value_b7 key8: value_b8 key9: value_b9

没关系,解决它! 谢谢!

\uFEFF是Big Endian UTF-16 BOM。 取决于Python的版本以及打开文件的方式,打开时可能不会去除。

我想稍微改变输出格式,但无法从文档页面正确地使用它。 如果您能提供帮助,那就太好了。 寻找key1: value_a1 n key2: value_a2 n key3: n - key4: value_a4 n key5: n key6: n - value_a6 n key7: value_a7 n key8: value_a8 n key9: value_a9。 / n =换行符,无法使其在新的注释窗口中正常工作

我不知道您的期望是什么,请尽量不要滥用(跟进)问题的评论。 您应该发布新的后续问题,并以所需的输出格式正确。 请参阅此代码,即您拥有的代码。 如果您将其标记为python,yaml和ruamel.yaml,则会自动收到通知

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐