UnicodeDecodeError:“ utf-8”编解码器无法解码位置1551的字节0x87:无效的起始字节

问题描述

我正在尝试在Python上检查Wifi密码程序,因此遇到一些我无法理解的有关unicodeDecodeError的问题

这是我的升级终端:

C:\Users\bartu\Desktop\Python\pythonSmallProject>python check_wifi_password.py
Traceback (most recent call last):
  File "check_wifi_password.py",line 10,in <module>
    data = subprocess.check_output(['netsh','wlan','show','profiles']).decode(get_encoding).split('\n') # Now we will store the profiles data in the "data" variable by
TypeError: decode() argument 'encoding' must be str,not function

这是我的更新代码

import subprocess   # first we will import the subprocess module
import os
from chardet import detect

def get_encoding(file):
    with open(file,'rb') as f:
        data = f.read()
    return detect(data)['encoding']

data = subprocess.check_output(['netsh','profiles']).decode(get_encoding).split('\n') # Now we will store the profiles data in the "data" variable by
                                                                                               # running the 1st cmd command using subprocess.check_output
profiles =  [i.split(":")[1][1:-1] for i in data  if "All User Profile" in i]  # Now we will store the profile by converting them to list

# using  for loop in python we re checking and printing the Wifi
# passwords  if they  are avaiable using the 2nd cmd command
for i in profiles:
    # running the 2nd cmd command to check  passwords
    results = subprocess.check_output(['netsh','profile',i,'key = clear']).decode(get_encoding).split('\n')
    # storing passwords after converting them to list
    results = [j.split(":")[1][1:-1]  for j in results if " Key Content" in j]
    # printing the profiles(wifi name) with their passwords using
    # try and except
try:
    print("{:<30} | {:<}".format(i,results[0]))
except IndexError:
    print("{:<30} | {:<}".format(i,""))
except subprocess.CalledProcessError:
    print("{:<30} | {:<}".format(i,"ENCODING ERROR"))
print("")

解决方法

您是否尝试过使用latin编码?

data = subprocess.check_output(['netsh','wlan','show','profiles']).decode('latin1').split('\n')

如果它不起作用,请尝试从文件中获取编码-

import os    
from chardet import detect

def get_encoding(data):
    return detect(data)['encoding']

data = subprocess.check_output(['netsh','profiles'])
data_encoding = get_encoding(data)
decoded_data = data.decode(data_encoding).split('\n')