【发布时间】:2019-03-24 17:37:53
【问题描述】:
有一个日志文件,其中包含以空格分隔的key=value 对形式的文本,每一行最初都是从 Python 字典中的数据序列化的,类似于:
' '.join([f'{k}={v!r}' for k,v in d.items()])
键总是只是字符串。这些值可以是 ast.literal_eval 可以成功解析的任何值,不多不少。
如何处理这个日志文件并将这些行转换回 Python 字典? 示例:
>>> to_dict("key='hello world'")
{'key': 'hello world'}
>>> to_dict("k1='v1' k2='v2'")
{'k1': 'v1', 'k2': 'v2'}
>>> to_dict("s='1234' n=1234")
{'s': '1234', 'n': 1234}
>>> to_dict("""k4='k5="hello"' k5={'k6': ['potato']}""")
{'k4': 'k5="hello"', 'k5': {'k6': ['potato']}}
以下是有关数据的一些额外上下文:
- 密钥是valid names
- 输入行格式正确(例如,没有悬空括号)
- 数据可信(
eval、exec、yaml.load等不安全函数可以使用) - 顺序并不重要。性能并不重要。正确性很重要。
编辑:根据 cmets 的要求,这里是一个 MCVE 和一个无法正常工作的示例代码
>>> def to_dict(s):
... s = s.replace(' ', ', ')
... return eval(f"dict({s})")
...
...
>>> to_dict("k1='v1' k2='v2'")
{'k1': 'v1', 'k2': 'v2'} # OK
>>> to_dict("s='1234' n=1234")
{'s': '1234', 'n': 1234} # OK
>>> to_dict("key='hello world'")
{'key': 'hello, world'} # Incorrect, the value was corrupted
【问题讨论】:
-
您似乎希望我们为您编写一些代码。虽然许多用户愿意为陷入困境的编码人员编写代码,但他们通常只在发布者已经尝试单独解决问题时提供帮助。展示这种努力的一个好方法是包含Minimal, complete, verifiable example。在发帖前检查你完成的intro tour,尤其是How to Ask。
-
拥有 150k 代表,您会认为会显示一些代码...
-
哎哟。我认为 wim 知道How to Ask。这与 gimmethecode 作业问题不同......
-
您从 python 答案中获得了 11,720 名声望。很惊讶你不能敲出一些代码,或者你不知道你应该这样做。
-
@Prune tss tss 罐装 cmets 代表低代表,upvotes 代表高代表?
标签: python string parsing dictionary logging