Error :cannot use a string pattern on a bytes-like object

霸气de小男生 提交于 2020-06-16 05:01:28

问题


Hy am using Python RegEx to show all internet wirless profiles connected to a computer.There is error (TypeError: cannot use a string pattern on a bytes-like object) in my Second last line pls anyone help to identifi my mistake.Thanks

My Program

import subprocess,re
command = "netsh wlan show profile"
output = subprocess.check_output(command, shell=True)  
network_names = re.search("(Profile\s*:\s)(.*)", output)  
print(network_names.group(0))

.....................................................

ERROR

line 8, in <module>


 return _compile(pattern, flags).search(string)


TypeError: cannot use a string pattern on a bytes-like object

回答1:


Python 3 distinguishes "bytes" and "string" types; this is especially important for Unicode strings, where each character may be more than one byte, depending on the character and the encoding.

Regular expressions can work on either, but it has to be consistent — searching for bytes within bytes, or strings within strings.

Depending on what you need, there are two solutions:

  • Decode the output variable before searching in it; for instance, with: output_text = output.decode('utf-8')

    This depends on the encoding that you are using; UTF-8 is the most common these days.

    The matched group will be a string.

  • Search with bytes by adding a b prefix to the regular expression. A regular expression should also use the r prefix, so it becomes: re.search(br"(Profile\s*:\s)(.*)", output)

    The matched group will be a bytes object.




回答2:


From the documentation for Popen.stdout:

If the stdout argument was PIPE, this attribute is a readable stream object as returned by open(). Reading from the stream provides output from the child process. If the encoding or errors arguments were specified or the universal_newlines argument was True, the stream is a text stream, otherwise it is a byte stream. If the stdout argument was not PIPE, this attribute is None.

So without setting these options you get a byte stream.

subprocess.check_output supports an encoding keyword argument. Set this to 'utf8' and you will get a text stream:

output = subprocess.check_output(command, shell=True, encoding='utf8')



回答3:


I tried the same code on my computer with python 2.7. Works perfect.

Output is a str object on my side.

I think you can add a line after this code "output = subprocess.check_output(command, shell=True)", the line is print(type(output)).

You may see the real data type, if it's not str, try to use output = str(output) to convert it to str



来源:https://stackoverflow.com/questions/61720217/error-cannot-use-a-string-pattern-on-a-bytes-like-object

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!