Python 3,pythonic方式获取字节的字符串文字表示?

lai*_*e9m 0 python python-3.x

类似的问题,但解决方案似乎不起作用.

说我编码了一个字符串:

>>> a = 'dada??'.encode('utf-8')
>>> type(a)
<class 'bytes'>
>>> a
>>> b'dada\xe5\xa4\xa7\xe5\xa4\xa7'
Run Code Online (Sandbox Code Playgroud)

我想要的是这样的:

dada\xe5\xa4\xa7\xe5\xa4\xa7
Run Code Online (Sandbox Code Playgroud)

str(a) 不起作用:

>>> str(a)
>>> "b'dada\\xe5\\xa4\\xa7\\xe5\\xa4\\xa7'"
Run Code Online (Sandbox Code Playgroud)

我已经尝试将stdout重定向到一个变量,但仍然,我得到了"b'dada\\xe5\\xa4\\xa7\\xe5\\xa4\\xa7'".

我可以使用正则表达式处理它并获得我想要的东西,但我正在寻找一种更加pythonic的方法来做到这一点.有什么建议?

pok*_*oke 5

你很高兴在评论中提到你的实际问题,我会再次更新我的答案以实际回应.原始答案可以在下面看到.

这是我发给Github Markdown API的字符串.这是可以接受unicode字符的唯一方法.我得到了带有orignal字符的渲染htmldada??

GitHub的降价API需要用户将数据发送的JSON.JSON本身借用了从JavaScript转义的字符串,这将\u5927用于此角色.但是,在使用json模块时,您根本不需要担心:

from urllib import urlopen
import json

text = 'dada??'
data = json.dumps({ mode: 'markdown', 'text': text }).encode()
r = urlopen('https://api.github.com/markdown', data)

print(r.read().decode()) # <p>dada??</p>
Run Code Online (Sandbox Code Playgroud)

如您所见,API可以毫无问题地接受编码文本并正确生成正确的输出,而无需担心编码.

或者在requests库中使用原始API时:

h = { 'Content-Type': 'text/plain' }
r = requests.post('https://api.github.com/markdown/raw', text.encode(), headers=h)

print(r.content.decode()) # <p>dada??</p>
Run Code Online (Sandbox Code Playgroud)

原始答案

>>> a = 'dada??'.encode('utf-8')
>>> a
b'dada\xe5\xa4\xa7\xe5\xa4\xa7'
>>> str(a)
"b'dada\\xe5\\xa4\\xa7\\xe5\\xa4\\xa7'"
>>> str(a)[2:-1]
'dada\\xe5\\xa4\\xa7\\xe5\\xa4\\xa7'
>>> print(_)
dada\xe5\xa4\xa7\xe5\xa4\xa7
Run Code Online (Sandbox Code Playgroud)

当你这样做时,str(a)你将获得字节字符串的字符串表示.当然,当你在解释器中使用它时,解释器实际上会调用repr它来显示它.并且包含反斜杠的字符串会将它们转义为\\.这就是那些人来自的地方.

最后,你必须剥离b'和尾随'以获得字节字符串的字符串表示的内容.

旁注:str()repr()上个字节的对象时会产生相同的结果.


根据Poke的回答,我需要的是阻止自动转换repr.

不,你没有.最终字符串中没有双反斜杠.它们只出现,因为当您在REPL中输入内容时,它会在调用它们之后将事物的返回值输出到控制台repr.但这并不意味着,实际的字符串突然改变了:

>>> s = str(a)[2:-1]
>>> len(s)
28
>>> list(s)
['d', 'a', 'd', 'a', '\\', 'x', 'e', '5', '\\', 'x', 'a', '4', '\\', 'x', 'a', '7', '\\', 'x', 'e', '5', '\\', 'x', 'a', '4', '\\', 'x', 'a', '7']
Run Code Online (Sandbox Code Playgroud)

如您所见,字符串中没有双反斜杠.是的,你可以再次看到它们,但这又是因为list(s)REPL打印的返回值.列表中每个项目都是单个字符,包括反斜杠.它们只是再次转义,因为它'\'不是有效的字符串.

>>> '\'
SyntaxError: EOL while scanning string literal
>>> '\\'
'\\'
>>> len('\\')
1
Run Code Online (Sandbox Code Playgroud)