我知道这与this SO question有关,但是我最担心的是这是否可能与保留的注释等内容混淆。
import ruamel.yaml as yaml
yaml_str = """\
first_name: Art
occupation: Architect # This is an occupation comment
about: Art Vandelay is a fictional character that George invents...
"""
data = yaml.load(yaml_str, Loader=yaml.RoundTripLoader)
# I'd like to extend CommentedMap so that I can do something like:
data.insert(1, 'last_name', 'Vandelay')
print(yaml.dump(data, Dumper=yaml.RoundTripDumper))
应该输出:
first_name: Art
last_name: Vandelay
occupation: Architect # This is an occupation comment
about: Art Vandelay is a fictional character that George invents...
不应该输出:
first_name: Art
last_name: Vandelay # This is an occupation comment
occupation: Architect
about: Art Vandelay is a fictional character that George invents...
参考方案
在Python 2.7和至少具有ruamel.yaml 0.11.11的Python 3.X上,这可以正常工作:
import ruamel.yaml
yaml_str = """\
first_name: Art
occupation: Architect # This is an occupation comment
about: Art Vandelay is a fictional character that George invents...
"""
data = ruamel.yaml.round_trip_load(yaml_str)
data.insert(1, 'last name', 'Vandelay')
print(ruamel.yaml.round_trip_dump(data))
给出:
first_name: Art
last name: Vandelay
occupation: Architect # This is an occupation comment
about: Art Vandelay is a fictional character that George invents...
因为行尾注释与CommentedMap
中的行键相关联。 (Linux Mint上的Python 2.7.11带有ruamel.yaml 0.11.10。)
这不适用于带有Python3的ruamel.yaml的旧版本,因为您使用的.insert()
是成熟的ruamel.ordereddict
的功能,并且标准库中的OrderedDict没有该方法。因此,您需要将.insert()
函数嫁接到CommentedMap
上:
import ruamel.yaml
from ruamel.yaml.comments import CommentedMap
from ruamel.yaml.compat import ordereddict
yaml_str = """\
first_name: Art
occupation: Architect # This is an occupation comment
about: Art Vandelay is a fictional character that George invents...
"""
def com_insert(self, pos, key, value, comment=None):
od = ordereddict()
od.update(self)
for k in od:
del self[k]
for index, old_key in enumerate(od):
if pos == index:
self[key] = value
self[old_key] = od[old_key]
if comment is not None:
self.yaml_add_eol_comment(comment, key=key)
CommentedMap.insert = com_insert
data = ruamel.yaml.round_trip_load(yaml_str)
data.insert(1, 'last name', 'Vandelay', comment="new key")
print(ruamel.yaml.round_trip_dump(data))
在Python3上给出:
first_name: Art
last name: Vandelay # new key
occupation: Architect # This is an occupation comment
about: Art Vandelay is a fictional character that George invents...
请注意,insert()
有一个可选参数,允许您为新插入的键值对指定注释。上面的方法有效,因为从CommentedMap
删除键不会删除与该键关联的注释。因此,我将旧的键值对临时存放在od
中
删除所有键值,然后将它们复制回去,并在适当的时候插入新内容
上面的insert
,带有注释,已添加到ruamel.yaml 0.11.11中,用于
Python 2和3
.round_trip_load()
等效于.load(...., Loader=ruamel.yaml.RoundTripLoader, ...)
,.round_trip_dump()
等效于`.dump(.....,Dumper = ruamel.yaml.RoundTripDumper,allow_unicode = True,...)
我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…
Python-Excel导出 - python我有以下代码:import pandas as pd import requests from bs4 import BeautifulSoup res = requests.get("https://www.bankier.pl/gielda/notowania/akcje") soup = BeautifulSoup(res.cont…
Python:传递记录器是个好主意吗? - python我的Web服务器的API日志如下:started started succeeded failed 那是同时收到的两个请求。很难说哪一个成功或失败。为了彼此分离请求,我为每个请求创建了一个随机数,并将其用作记录器的名称logger = logging.getLogger(random_number) 日志变成[111] started [222] start…
Python pytz时区函数返回的时区为9分钟 - python由于某些原因,我无法从以下代码中找出原因:>>> from pytz import timezone >>> timezone('America/Chicago') 我得到:<DstTzInfo 'America/Chicago' LMT-1 day, 18:09:00 STD…
用大写字母拆分字符串,但忽略AAA Python Regex - python我的正则表达式:vendor = "MyNameIsJoe. I'mWorkerInAAAinc." ven = re.split(r'(?<=[a-z])[A-Z]|[A-Z](?=[a-z])', vendor) 以大写字母分割字符串,例如:'我的名字是乔。 I'mWorkerInAAAinc”变成…