如何在 YAML 文件的 Python 中打印没有字符串的 []
How can I print [] without string in Python in YAML file
在我的 yam 文件中,我正在尝试这个
with open(fname, "w") as f:
yaml.safe_dump({'items':['test', 'test2']}, f,
default_flow_style=False, width=50, indent=4)
打印格式如下
items:
- 'test'
- 'test2'
我希望输出格式如下
items: ['test', 'test2']
我该怎么做?
编辑:
这是我的完整代码
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)
不要把 default_flow_style=False
然后 does the complete opposite of what you want:
>>> 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'
至于部分文档格式,您可以自定义representers,例如:
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)
如果你想要精细控制并且只有具有流式样式的特定列表,你应该使用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)
会给你:
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
CommentedSeq
的行为就像一个普通的 Python 列表,但允许您指定注释、设置 flow/block 样式等。
ruamel.yaml
通常用于在往返 YAML 时保留注释、flow/block 元素样式等。 IE。如果您要追加:
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
断言成立。
但它当然也可以用于从头开始生成 YAML。你可以例如还可以使用 CommentedMap 类型并保持 dict/mapping 的键有序。
在我的 yam 文件中,我正在尝试这个
with open(fname, "w") as f:
yaml.safe_dump({'items':['test', 'test2']}, f,
default_flow_style=False, width=50, indent=4)
打印格式如下
items:
- 'test'
- 'test2'
我希望输出格式如下
items: ['test', 'test2']
我该怎么做?
编辑:
这是我的完整代码
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)
不要把 default_flow_style=False
然后 does the complete opposite of what you want:
>>> 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'
至于部分文档格式,您可以自定义representers,例如:
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)
如果你想要精细控制并且只有具有流式样式的特定列表,你应该使用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)
会给你:
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
CommentedSeq
的行为就像一个普通的 Python 列表,但允许您指定注释、设置 flow/block 样式等。
ruamel.yaml
通常用于在往返 YAML 时保留注释、flow/block 元素样式等。 IE。如果您要追加:
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
断言成立。
但它当然也可以用于从头开始生成 YAML。你可以例如还可以使用 CommentedMap 类型并保持 dict/mapping 的键有序。