我想在python3中将b'\xc2\xa0\x38'
转换为b'x38'
。
b'\xc2\xa0\x38'.replace(u'\xc2\xa0',"")
b'\xc2\xa0\x38'.replace(u'\xc2a0',"")
TypeError: a bytes-like object is required, not 'str'
在网页中,c2 a0
表示NO-BREAK SPACE,其Unicode点为U + 00A0。
Unicode code point character UTF-8 (hex.) name
U+00A0 c2 a0 NO-BREAK SPACE
注意:c2a0
是不可打印的,此处字符列为空白。
relationship on unicode point,character,utf-8
如何使用replace方法将b'\xc2\xa0\x38'
转换为b'\x38'
?
答案 0 :(得分:8)
您已经快要在那里了
b'\xc2\xa0\x38'.replace(b'\xc2\xa0',b'')
答案 1 :(得分:5)
b'\xc2\xa0\x38'.replace(u'\xc2\xa0',"")
b'\xc2\xa0\x38'.replace(u'\xc2a0',"")
由于b'\xc2\xa0\x38'
是bytes object,因此不能在其上使用字符串方法。因此,当您在其上呼叫.replace()
时,您不是在呼叫bytes.replace
,而是在呼叫one of the many ways。尽管这两种外观和行为非常相似,但它们仍适用于不同的类型:
str.replace
用另一个 string 替换 string 中的 substring 。并且str.replace
用另一个 bytestring 替换 bytestring 中的 sub-bytestring 。因此,所有参数的类型始终匹配:
bytes.replace
因此,要替换字节字符串中的内容,您需要传递字节对象:
str.replace(str, str)
bytes.replace(bytes, bytes)
如何使
>>> b'\xc2\xa0\x38'.replace(b'\xc2\xa0', b'') b'8' >>> b'\xc2\xa0\x38'.replace(b'\xc2a0', b'') b'\xc2\xa08'
显示为b'8'
?
您一般不能这样做。 b'\x38'
和b'8'
彼此相等:
b'\x38'
两者都包含相同的单字节值>>> b'8' == b'\x38'
True
。只是有多种方法可以在Python中将内容表示为字节文字。就像您可以编写0x38
,10
,0xA
或0b1010
来引用具有十进制值的 same 0o12
对象一样10个字节,您可以用多种方式描述一个字节对象。
现在,当您使用交互式Python REPL时,只要编写int
,Python就会解释该字节文字,并用单个字节0x38创建一个字节对象,然后REPL将打印出{该字节对象的{1}}。字节对象的repr()碰巧会尽可能尝试使用ASCII字母。
无法更改此设置,但也无需 进行更改。您看到的b'\x38'
只是同一字节对象的一个表示。而且,如果您使用该对象并对它进行某些处理(例如,将其写入文件,对其进行转换或通过网络发送),则发送的是实际字节,而不是字节对象的某些字符串表示形式。>
但是,如果您想实际打印 bytes对象,则可以使用自己喜欢的表示形式将其故意转换为字符串。例如,如果您想要字节字符串的十六进制表示,则可以使用{{3}}来做到这一点:
repr()
答案 2 :(得分:-1)
是从文件读取数据吗?也许您以二进制模式打开了文件:
with open(fname, 'rb') as f:
这意味着从文件读取的数据将作为bytes
对象而不是str
返回。
如果是这样,请尝试通过将'rb'
模式替换为'r'
来以文本文件形式打开文件。