在Python中拆分字符串并转换为JSON
我有一个这样的字符串:
{'4': {1, 2}, '2': {1, 2}, '0': {1, 2}}["eq('2', '0')", "eq('2', '4')", "eq('0','4')"]
我只需要在["eq('2'....之前的所有内容,所以我只需要保存 {'4': {1, 2}, '2': {1, 2}, '0': {1, 2}}。我不能使用索引,因为长度每次都可能不同,所以我必须以某种方式检查"["。有没有什么方法可以在Python中做到这一点,然后把结果转换成JSON格式?我对Python还很陌生,所以希望能得到一些帮助。
1 个回答
如果格式真的这么具体,那就简单多了:只需要在 [
处进行分割,因为在 {…}
里面没有 [
的部分。所以:
>>> s = """{'4': {1, 2}, '2': {1, 2}, '0': {1, 2}}["eq('2', '0')", "eq('2', '4')", "eq('0','4')"]"""
>>> sd, _, sl = s.partition('[')
>>> sl = '[' + sl
现在,假设你并不想把这个 字符串 转换成 JSON,而是想把这个字符串所代表的 字典
转换成 JSON。要做到这一点,你需要用 eval
来处理它。因为你只有一些显示的字面量,所以可以使用安全的 ast.literal_eval
函数来完成这个操作。所以:
>>> import ast
>>> d = ast.literal_eval(sd)
>>> sd
"{'4': {1, 2}, '2': {1, 2}, '0': {1, 2}}"
>>> d
{'2': {1, 2}, '4': {1, 2}, '0': {1, 2}}
不过,你仍然不能把它转成 JSON,因为 {1, 2}
是一个集合,而 JSON 不支持集合。你需要决定把它转换成什么。是数组?一个值为 None
的字典?还是其他什么东西?
要把所有的集合转换成列表(可以被表示为 JSON 数组),你有两个选择。
第一个是创建一个 JSONEncoder
的子类。在 文档 的开头有一个很好的例子,展示了如何把 complex
值编码成两个元素的列表,你可以很容易地调整这个例子:只需把 complex
改成 set
,把 [o.real, o.imag]
改成 list(o)
。
第二个选择是预处理数据。就像最开始解析一样,这个过程的难易程度取决于你的格式有多严格。如果字典的所有顶层值都是集合,而其他的都不是集合,那么只需用 {k: list(v) for k, v in sd.items()}
就可以了。另一方面,如果你有一个任意的字典,里面递归地包含集合、字符串、数字、字典和列表,那么你可能需要写一个递归函数来进行转换。
与此同时……你是从哪里得到这些数据的?我猜测你可能在代码的其他部分只是打印了一个字典(或者用 f.write
写了一个字典的 str()
…)后面跟着一个列表。如果是这样的话,不如直接修改你的代码,先写出 JSON(或者其他可解析的格式)。
如果你的格式稍微复杂一点——比如字典里面可能有列表——你就需要做一些更复杂的处理。例如,你可以计算打开的花括号减去关闭的花括号,继续这个过程直到回到 0,这样就能得到字典了。