如何在python3中用无字符替换`c2a0`?

时间:2018-08-02 12:22:45

标签: python string python-3.x replace byte

我想在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'

3 个答案:

答案 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中将内容表示为字节文字。就像您可以编写0x38100xA0b1010来引用具有十进制值的 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'来以文本文件形式打开文件。