Python字符串字节到字节的转换

4

我有一些看起来像 Python 中 JSON 字节表示的 字符串 数据

>>> data = """b'{"a": 1, "b": 2}\n'"""

在它的内部,我们有一个有效的JSON,看起来像是被字节编码了。我想要对这些字节进行解码,然后loads内部的JSON,但由于它是一个字符串,所以我不能直接操作。

>>> data.decode() # nope
AttributeError: 'str' object has no attribute 'decode'

对字符串进行编码似乎也没有帮助:

>>> data.encode() # wrong
b'b\'{"a": 1, "b": 2}\n\''

stackoverflow上有很多有关字符串转字节的问题,但是我却找不到任何有关这个特定问题的信息。有人知道如何实现吗?

以下是我不想做和/或行不通的事情:

  1. 将数据eval为字节对象
  2. 去掉b\n(我的JSON中有各种其他转义数据)。

这是我找到的唯一有效解决方案,但是有很多缺陷

from ast import literal_eval

data = """b'{"a": 1, "b": 2}\n'"""
print(literal_eval(data[:-2] + data[-1:]).decode('utf-8'))

1
我有一些看起来像是Python中JSON字节表示的字符串数据,这听起来像是在生产端应该修复的错误。 - user2357112
1
这些实际上是我必须分析的 airflow 日志 vis structlog。在将来,您可能可以配置 structlog 以提供更有用的内容。避免文本日志解析应该是 structlog 的主要目标之一。 - user2357112
2
无论如何,ast.literal_eval。这里可能有一个很好的重复目标。 - user2357112
2
你在尝试写literal_eval时所做的奇怪切片几乎肯定是由于你在尝试为data编写字符串文字时引入了一个错误 - 你在字面量中间有一个实际的换行符,这是字节文字的无效语法。你可能想要那个实际的反斜杠和n - 或者换行符应该在字节文字之外。 - user2357112
2
数据 = r"""b'{"a": 1, "b": 2}\n'""" 更可能代表您正在处理的实际值。如果不是这样,那将是一个问题。 - user2357112
显示剩余4条评论
1个回答

2

我知道你说你不想去掉字符串中的b,因为有其他转义数据,但我们可以假设生成此输出的任何内容都只输出ASCII(因此有b),然后我们可以重新编码它。所以我想你可以使用一个简单的正则表达式(https://regex101.com/r/M0ratk/1),然后将其编码为字节。

import json
import re

match = re.match(r"\Ab'(.*)'\Z", data, re.DOTALL)
data = json.loads(bytes(match[1], 'ascii'))

这样行吗?我不确定它与literal_eval解决方案相比如何。


1
在我最疯狂的梦想中,我从未想过会有一个正则表达式的解决方案,哇哇。 - Nolan Conaway
我能说什么呢,当你每天工作的大部分时间都在编写正则表达式时,所有事情都开始看起来像是一个正则表达式问题。 - Ryan
2
@NolanConaway 现在你有两个问题。(这是一个著名的引用,请查阅) - Mark Ransom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接