最近为了体验python实时画图功能,必须把python升级到更高的版本(升级到3.6.8),安装matplotlib库,但是发现一些之前的旧例子无法正常运行,在调试的时候发现执行命令后,返回的值是byte
而不是str
。所以这里总结下
环境:Python 3.6.8
1.转换方法
- 1)byte转换成str
- str(bdata, encoding = “utf-8”) ,其中bdata为byte类型的数据,encoding为编码格式,也可以是
GBK,unicode,ASCII
. - bytes.decode(bb),其中bb即为byte类型的数据
- str(bdata, encoding = “utf-8”) ,其中bdata为byte类型的数据,encoding为编码格式,也可以是
- 2)str转换成byte
- bytes(str1, encoding = “utf8”) ,其中str1要转换的str数据,同样endoding为编码格式,也可以是
GBK,unicode,ASCII
. - str.encode(ss) ,其中ss即为str类型的数据
- bytes(str1, encoding = “utf8”) ,其中str1要转换的str数据,同样endoding为编码格式,也可以是
具体都在例子中,对照例子和打印结果查看确认下。
#byte ----------> str
print('1.byte ----------> str')
bdata = b'I\'armwind'
print(' bdata type:%s' %type(bdata))
byte2str = str(bdata, encoding = "utf-8")
print(' byte2str type:%s' %type(byte2str))
#str ----------> byte
print('2.str ----------> byte')
str1 = "hello world"
print(' str1 type:%s' %type(str1))
str2byte = bytes(str1, encoding = "utf8")
print(' str2byte type:%s' %type(str2byte))
# simple default method
print('\n3.simple default method')
# str to bytes
ss = "armwind"
print(' ss type:%s' %type(ss))
s2b = str.encode(ss)
print(' s2b type:%s' %type(s2b))
# bytes to str
bb = b'hello world'
print(' bb type:%s' %type(bb))
b2s = bytes.decode(bb)
print(' b2s type:%s' %type(b2s))
打印结果:
D:\test\python>python 1.py
1.byte ----------> str
bdata type:<class 'bytes'>
byte2str type:<class 'str'>
2.str ----------> byte
str1 type:<class 'str'>
str2byte type:<class 'bytes'>
3.simple default method
ss type:<class 'str'>
s2b type:<class 'bytes'>
bb type:<class 'bytes'>
b2s type:<class 'str'>
2.案例实践(获取android进程ID)
下面是获取Android某一个进程的PID的脚本,只需要修改进程名字即可(电脑需连接Android手机)。
import subprocess
PROCESS_NAME = 'mediaserver'
cmd2 = ('adb shell ps')
process2 = subprocess.Popen(cmd2.split(), stdout=subprocess.PIPE)
cmd_ret2 = process2.stdout.read()
cmd_list = cmd_ret2.split('\n');
for cam in cmd_list :
if (PROCESS_NAME in cam) :
cam = cam.split()
print("pid:%d" %cam[1])
运行结果:
D:\test\python>python 1.py
Traceback (most recent call last):
File "1.py", line 7, in <module>
cmd_list = cmd_ret2.split('\n');
TypeError: a bytes-like object is required, not 'str'
修改后的代码把byte先转换成str类型,然后用str的内部函数,对字符串进行分割。
import subprocess
PROCESS_NAME = 'mediaserver'
cmd2 = ('adb shell ps')
process2 = subprocess.Popen(cmd2.split(), stdout=subprocess.PIPE)
cmd_ret2 = process2.stdout.read()
cmd_str = str(cmd_ret2, encoding = "utf-8")
cmd_list = cmd_str.split('\n');#按换行字符进行分割
for cam in cmd_list :
if (PROCESS_NAME in cam) :
cam = cam.split()
print("pid:%s" %cam[1])
运行之后:
D:\test\python>python 1.py
pid:339