gpt4 book ai didi

python转换为yaml格式问题

转载 作者:行者123 更新时间:2023-12-01 03:56:51 25 4
gpt4 key购买 nike

我有以下简单的脚本

#!/usr/bin/env python

import yaml

returns = {'file_|-/usr/bin/gen-motd.py_|-/usr/bin/gen-motd.py_|-managed': {'comment': 'File /usr/bin/gen-motd.py updated', 'pchanges': {'diff': '--- \n+++ \n@@ -1,5 +1,7 @@\n #!/usr/bin/env python\n \n+import sys\n+import urllib2\n import socket\n import json\n import time\n'}, 'name': '/usr/bin/gen-motd.py', 'start_time': '16:18:54.060168', 'result': True, 'duration': 99.663, '__run_num__': 1, 'changes': {'diff': '--- \n+++ \n@@ -1,5 +1,7 @@\n #!/usr/bin/env python\n \n+import sys\n+import urllib2\n import socket\n import json\n import time\n'}, '__id__': '/usr/bin/gen-motd.py'}}
returns = yaml.dump(returns, default_flow_style=False)
print returns

其输出

file_|-/usr/bin/gen-motd.py_|-/usr/bin/gen-motd.py_|-managed:
__id__: /usr/bin/gen-motd.py
__run_num__: 1
changes:
diff: "--- \n+++ \n@@ -1,5 +1,7 @@\n #!/usr/bin/env python\n \n+import sys\n+import\
\ urllib2\n import socket\n import json\n import time\n"
comment: File /usr/bin/gen-motd.py updated
duration: 99.663
name: /usr/bin/gen-motd.py
pchanges:
diff: "--- \n+++ \n@@ -1,5 +1,7 @@\n #!/usr/bin/env python\n \n+import sys\n+import\
\ urllib2\n import socket\n import json\n import time\n"
result: true
start_time: '16:18:54.060168'

差异部分的格式错误..我希望它返回类似的内容

file_|-/usr/bin/gen-motd.py_|-/usr/bin/gen-motd.py_|-managed: 
__id__: /usr/bin/gen-motd.py
__run_num__: 1
changes:
diff: |
---
+++
@@ -1,5 +1,7 @@
#!/usr/bin/env python

+import sys
+import urllib2
import socket
import json
import time
comment: "File /usr/bin/gen-motd.py updated"
duration: 99.663
name: /usr/bin/gen-motd.py
pchanges:
diff: |
---
+++
@@ -1,5 +1,7 @@
#!/usr/bin/env python

+import sys
+import urllib2
import socket
import json
import time
result: true
start_time: "16:18:54.060168"

最佳答案

要实现您想要的效果,需要克服两个问题:

  • 您的行在换行符之前不能有空格,因为无法以文字样式标量表示它
  • 您需要提供一个例程,将带有换行符的字符串作为文字样式标量输出,或者使用支持该格式的 YAML 库,例如 ruamel.yaml(免责声明:我是该包的作者)。

使用ruamel.yaml是更简单的方法,只需转换3层深度并包含换行符的字符串:

import sys
import ruamel.yaml
from ruamel.yaml.scalarstring import LiteralScalarString

returns = {'file_|-/usr/bin/gen-motd.py_|-/usr/bin/gen-motd.py_|-managed': {'comment': 'File /usr/bin/gen-motd.py updated', 'pchanges': {'diff': '--- \n+++ \n@@ -1,5 +1,7 @@\n #!/usr/bin/env python\n \n+import sys\n+import urllib2\n import socket\n import json\n import time\n'}, 'name': '/usr/bin/gen-motd.py', 'start_time': '16:18:54.060168', 'result': True, 'duration': 99.663, '__run_num__': 1, 'changes': {'diff': '--- \n+++ \n@@ -1,5 +1,7 @@\n #!/usr/bin/env python\n \n+import sys\n+import urllib2\n import socket\n import json\n import time\n'}, '__id__': '/usr/bin/gen-motd.py'}}

for k in returns:
for k1 in returns[k]:
if not isinstance(returns[k][k1], dict):
continue
for k2 in returns[k][k1]:
v = returns[k][k1][k2]
try:
if '\n' in v:
while ' \n' in v:
v = v.replace(' \n', '\n') # remove EOL spaces
returns[k][k1][k2] = LiteralScalarString(v)
except TypeError:
continue

yaml = ruamel.yaml.YAML()
yaml.dump(returns, sys.stdout)

您当然可以删除整个for构造并使用

returns = {'file_|-/usr/bin/gen-motd.py_|-/usr/bin/gen-motd.py_|-managed': {'comment': 'File /usr/bin/gen-motd.py updated', 'pchanges': {'diff': PreservedScalarString('---\n+++\n@@ -1,5 +1,7 @@\n #!/usr/bin/env python\n\n+import sys\n+import urllib2\n import socket\n import json\n import time\n')}, 'name': '/usr/bin/gen-motd.py', 'start_time': '16:18:54.060168', 'result': True, 'duration': 99.663, '__run_num__': 1, 'changes': {'diff': PreservedScalarString('---\n+++\n@@ -1,5 +1,7 @@\n #!/usr/bin/env python\n\n+import sys\n+import urllib2\n import socket\n import json\n import time\n')}, '__id__': '/usr/bin/gen-motd.py'}}

无论哪种方式,这都会给你:

file_|-/usr/bin/gen-motd.py_|-/usr/bin/gen-motd.py_|-managed:
start_time: '16:18:54.060168'
comment: File /usr/bin/gen-motd.py updated
duration: 99.663
__id__: /usr/bin/gen-motd.py
changes:
diff: |
---
+++
@@ -1,5 +1,7 @@
#!/usr/bin/env python

+import sys
+import urllib2
import socket
import json
import time
__run_num__: 1
pchanges:
diff: |
---
+++
@@ -1,5 +1,7 @@
#!/usr/bin/env python

+import sys
+import urllib2
import socket
import json
import time
name: /usr/bin/gen-motd.py
result: true

由于您使用的是 dict,YAML 文件中键的顺序不确定。您可以使用 CommentedMap 实例(来自 ruamel.yaml.comments)和 PreservedScalarString 直接构造 returns 并控制YAML 映射中的关键顺序也是如此。

关于python转换为yaml格式问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37305172/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com