简体   繁体   English

如何在YAML文件的Python中打印不带字符串的[]

[英]How can I print [] without string in Python in YAML file

In my yam file I am trying this 在我的山药文件中,我正在尝试

with open(fname, "w") as f:
     yaml.safe_dump({'items':['test', 'test2']}, f,
                    default_flow_style=False, width=50, indent=4)

It prints in the below format 它以以下格式打印

items:
- 'test'
- 'test2'

I want the output formatted like below 我希望输出格式如下

items: ['test', 'test2']

How can I do that ? 我怎样才能做到这一点 ?

EDIT: 编辑:

This is my complete code 这是我完整的代码

   d = {}        
   for m in ['B1', 'B2', 'B3']:
                d2 = {}
                for f in ['A1', 'A2', 'A3']:
                    # here i don't want any flow style
                    d2[f] = ['test', 'test2']
                d[m] = d2

    with open(fname, "w") as f:
        yaml.safe_dump(d, f, default_flow_style=True, width=50, indent=8)

Don't put the default_flow_style=False then, does the complete opposite of what you want : 然后,不要把default_flow_style=False放到与您想要的完全相反的位置

>>> import yaml
>>> yaml.safe_dump({'items': ['test', 'test2']}, default_flow_style=False)
'items:\n- test\n- test2\n'
>>> yaml.safe_dump({'items': ['test', 'test2']})
'items: [test, test2]\n'

As for partial document formatting, you can do with custom representers , eg: 对于部分文档格式设置,可以使用自定义表示形式 ,例如:

class Items(list):
    pass


def items_representer(dumper, data):
    return dumper.represent_sequence('tag:yaml.org,2002:seq', data, flow_style=True)


yaml.representer.SafeRepresenter.add_representer(Items, items_representer)

result = yaml.safe_dump({
    'items': Items(['test', 'test2']),
    'other list': ['1', '2'],
}, default_flow_style=False)

# items: [test, test2]
# other list:
# - '1'
# - '2'
print(result)

If you want fine control and only have specific lists with flow style , you should use ruamel.yaml (which is my enhanced version of PyYAML): 如果要进行精细控制,并且只具有带有流样式的特定列表 ,则应使用ruamel.yaml (这是我的PyYAML的增强版):

import ruamel.yaml
from ruamel.yaml.comments import CommentedSeq

d = {}
for m in ['B1', 'B2', 'B3']:
    d2 = {}
    for f in ['A1', 'A2', 'A3']:
        # here i don't want any flow style
        d2[f] = CommentedSeq(['test', 'test2'])
        if f != 'A2':
            d2[f].fa.set_flow_style()
    d[m] = d2

x = ruamel.yaml.dump(
    d, Dumper=ruamel.yaml.RoundTripDumper,
    default_flow_style=False, width=50, indent=8)
print(x)

will give you: 会给你:

B1:
        A1: [test, test2]
        A3: [test, test2]
        A2:
        - test
        - test2
B2:
        A1: [test, test2]
        A3: [test, test2]
        A2:
        - test
        - test2
B3:
        A1: [test, test2]
        A3: [test, test2]
        A2:
        - test
        - test2

The CommentedSeq behaves just like a normal Python list, but allows you to specify comment, set flow/block style etc. CommentedSeq行为就像普通的Python列表一样,但是允许您指定注释,设置流/块样式等。

ruamel.yaml is normally used to preserve comments, flow/block style on elements, etc., when round-tripping YAML. ruamel.yaml通常用于保留注释,元素上的流/块样式等。 Ie if you would append: 即,如果您要追加:

d2 = ruamel.yaml.load(x, Loader=ruamel.yaml.RoundTripLoader)
y = ruamel.yaml.dump(
    d2, Dumper=ruamel.yaml.RoundTripDumper, width=50, indent=8)
assert x == y

the assertion holds. 断言成立。

But it can of course be used to genenerate YAML from scratch as well. 但是它当然也可以用于从头生成YAML。 You could eg also use the CommentedMap type and keep the keys of your dict/mapping ordered. 例如,您也可以使用CommentedMap类型并保持字典/映射的键有序。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM