TypeError:无法在类似对象'python3.6'的字节上使用字符串模式`
我有下面的代码TypeError:无法在类似对象'python3.6'的字节上使用字符串模式`,python,Python,我有下面的代码 for eol in ['\r\n', '\r', '\n']: content = re.sub('%s$' % eol, '', content) 其中内容类型为字节 内容数据是 b"Trying IP...\r\nConnected to IP.\r\nEscape character is '^]'.\r\n" 内容类型 <class 'bytes'> 为什么会出现此错误如果无法控制内容的数据类型,可以使用类似的方法 for eo
for eol in ['\r\n', '\r', '\n']:
content = re.sub('%s$' % eol, '', content)
其中内容类型为字节
内容数据是
b"Trying IP...\r\nConnected to IP.\r\nEscape character is '^]'.\r\n"
内容类型
<class 'bytes'>
为什么会出现此错误如果无法控制内容的数据类型,可以使用类似的方法
for eol in [b'\r\n', b'\r', b'\n']:
content = re.sub(b'%s$' % eol, b'', content)
如果无法控制内容的数据类型,可以使用类似的方法
for eol in [b'\r\n', b'\r', b'\n']:
content = re.sub(b'%s$' % eol, b'', content)
pexpect
可以提供Unicode字符串,除非您要求它提供字节
如果您希望它为您提供字节,例如,因为您不知道编码,telnet
服务器希望您使用它,这很好,但是您必须将其作为字节处理。这意味着在re
中使用字节模式,而不是字符串模式:
for eol in [b'\r\n', b'\r', b'\n']:
content = re.sub(b'%s$' % eol, b'', content)
但如果您不需要字节,最好将所有内容解码为str
,您现有的代码就可以工作了:
content = pexpect.run('ls -l', encoding='utf-8')
for eol in ['\r\n', '\r', '\n']:
content = re.sub('%s$' % eol, '', content)
作为补充说明,如果您只是想删除最后一行的最后一个换行符,那么在没有正则表达式的情况下执行此操作要容易得多:
content = content.rstrip('\r\n')
或者,如果您正在尝试执行一些不同的操作,例如删除空行,那么即使是这样,也可以更明确地编写:
content = '\n'.join(line for line in content.splitlines() if line)
…但这仍然会给您带来同样的问题,即需要适当地使用
b'\n'
或'\n'
。pexpect
可以为您提供Unicode字符串,除非您要求它为您提供字节
如果您希望它为您提供字节,例如,因为您不知道编码,telnet
服务器希望您使用它,这很好,但是您必须将其作为字节处理。这意味着在re
中使用字节模式,而不是字符串模式:
for eol in [b'\r\n', b'\r', b'\n']:
content = re.sub(b'%s$' % eol, b'', content)
但如果您不需要字节,最好将所有内容解码为str
,您现有的代码就可以工作了:
content = pexpect.run('ls -l', encoding='utf-8')
for eol in ['\r\n', '\r', '\n']:
content = re.sub('%s$' % eol, '', content)
作为补充说明,如果您只是想删除最后一行的最后一个换行符,那么在没有正则表达式的情况下执行此操作要容易得多:
content = content.rstrip('\r\n')
或者,如果您正在尝试执行一些不同的操作,例如删除空行,那么即使是这样,也可以更明确地编写:
content = '\n'.join(line for line in content.splitlines() if line)
…但这仍然会给您带来同样的问题,即需要适当地使用
b'\n'
或'\n'
。想必内容
是字节
或其他类似字节的对象。既然你没有告诉我们它是什么或者它来自哪里,很难说得更多。可能问题在于您调用了encode
某个您不应该调用的地方,或者您正在使用请求
响应并使用r.content
而不是r.text
,或者您以二进制模式而不是文本模式打开了一个文件。或者,您只需要使用正确的编码调用context
上的decode
。或者它实际上应该是一个字节
,您只需要使用字节
模式,所以将所有这些字符串文本更改为字节文本。内容中的数据是什么?你能展示一下吗?好的,那么错误信息告诉你的和我刚才告诉你的完全一样。但如果这还不足以让你理解如何修复它,你需要给我们更多的上下文,内容
来自哪里,它是什么编码,它应该是一个字节
,你想用它做什么,等等。-因此,不要给你六个可能与你无关的选项,我们实际上可以给你一个答案。我的第一个想法-内容是类似字节的对象,而不是字符串。我不确定,检查一下。@ZRTSIM OP已经确认它是一个字节,甚至编辑成了问题。你为什么要让他检查它?大概内容是字节或其他类似字节的对象。既然你没有告诉我们它是什么或者它来自哪里,很难说得更多。可能问题在于您调用了encode
某个您不应该调用的地方,或者您正在使用请求
响应并使用r.content
而不是r.text
,或者您以二进制模式而不是文本模式打开了一个文件。或者,您只需要使用正确的编码调用context
上的decode
。或者它实际上应该是一个字节
,您只需要使用字节
模式,所以将所有这些字符串文本更改为字节文本。内容中的数据是什么?你能展示一下吗?好的,那么错误信息告诉你的和我刚才告诉你的完全一样。但如果这还不足以让你理解如何修复它,你需要给我们更多的上下文,内容
来自哪里,它是什么编码,它应该是一个字节
,你想用它做什么,等等。-因此,不要给你六个可能与你无关的选项,我们实际上可以给你一个答案。我的第一个想法-内容是类似字节的对象,而不是字符串。我不确定,检查一下。@ZRTSIM OP已经确认它是一个字节,甚至编辑成了问题。你为什么要让他检查?嘿,你能看看我的另一个开放式问题吗:答案被接受,因为你是第一个发表评论的人嘿,你能看看我的另一个开放式问题吗:答案被接受,因为你是第一个发表评论的人