如何在python3中将“c2a0”替换为none字符?

2024-04-26 23:24:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我想把python3中的b'\xc2\xa0\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表示unicode点为U+00A0的不间断空格。在

^{pr2}$

注意:c2a0不可打印,字符列在此为空。在

relationship on unicode point,character,utf-8

如何用replace方法将b'\xc2\xa0\x38'转换成{}?在


Tags: bytesobjectisunicoderequirednotreplacepython3
3条回答
b'\xc2\xa0\x38'.replace(u'\xc2\xa0',"")
b'\xc2\xa0\x38'.replace(u'\xc2a0',"")

由于b'\xc2\xa0\x38'bytes object,因此不能对其使用字符串方法。所以当你调用.replace()时,你不是在调用str.replace,而是^{}。虽然这两种类型的外观和行为非常相似,但它们仍在不同类型上运行:

str.replace用另一个字符串中的子串替换。并且bytes.replace用testring内的testring替换一个sub-bytestring。所以所有参数的类型总是匹配的:

^{pr2}$

因此,为了替换字节字符串中的某些内容,需要传递bytes对象:

>>> b'\xc2\xa0\x38'.replace(b'\xc2\xa0', b'')
b'8'
>>> b'\xc2\xa0\x38'.replace(b'\xc2a0', b'')
b'\xc2\xa08'

How to make b'8' displayed as b'\x38'?

你们总不能那样做。b'8'和{}都是相同的:

>>> b'8' == b'\x38'
True

两者都包含相同的单字节值0x38。只是在Python中有多种方法可以将内容表示为字节文本。正如您可以编写100xA0b1010或{}来引用十进制值为10的相同的int对象,您可以用多种方式描述bytes对象。在

现在,当您使用交互式Python REPL时,当您只编写b'\x38'时,Python将解释该bytes文本,用单字节0x38创建一个bytes对象,然后REPL将输出该bytes对象的repr()。而bytes对象的repr()恰好试图尽可能使用ASCII字母。在

没有办法改变这一点,但也没有必要改变它。您看到的b'8'只是同一bytes对象的一个表示。如果你使用这个对象并用它做一些事情(例如,把它写到一个文件中,转换它,或者通过网络发送),那么发送的是实际的字节,而不是字节对象的一些字符串表示。在

但是,如果您想实际打印bytes对象,可以使用您最喜欢的表示法将其转换为字符串。例如,如果您想要字节字符串的十六进制表示,可以使用one of the many ways来执行此操作:

>>> print(b'8'.hex())
38
>>> print(b'\x38'.hex())
38

你已经快到了:

b'\xc2\xa0\x38'.replace(b'\xc2\xa0',b'')

数据是从文件中读取的吗?也许你以二进制模式打开了文件:

with open(fname, 'rb') as f:

这意味着从文件中读取的数据将作为bytes对象返回,而不是str。在

如果是这样,请尝试以文本文件的形式打开该文件,方法是将'rb'模式替换为'r'。在

相关问题 更多 >