python 2.*和3.*的变化
1、urllib2是python自带的模块,在python3.x中被改为urllib.request,如
- <span style="font-size:12px;">url = "http://music.baidu.com/album/all?order=time&style=pop"
- html = urllib.request.urlopen(url).read()
- </span>
2、raw_input 和 input
在 Python 版本 2.x 中,raw_input() 会从标准输入(sys.stdin)读取一个输入并返回一个字符串,且尾部的换行符从末尾移除
- <span style="font-size:12px;">>>>quest = raw_input("What is your quest? ")
- What is your quest? To seek the holy grail.
- </span>
与之不同,Python 2.x 中的 input() 函数需要的是一个有效的 Python 表达式,比如 3+5
最初,曾有人建议将 input() 和 raw_input() 从 Python 内置的名称空间一并删除,因此就需要进行导入来获得输入能力。这从方法上就不对;因为,简单键入:
>>>quest = input("What is your quest?")
将会变为:
- <span style="font-size:12px;">>>>import sys
- >>>print("What is your quest?")
- >>>quest = sys.stdin.readline()
- </span>
对于一个简单输入而言,这太过繁琐,并且对于一个新手,这未免太难理解。往往需要向他们讲述模块 和导入 究竟是怎么回事、字符串输出以及句点操作符又是如何工作的(如此麻烦的话,与 Java™ 语言就没什么差别了)。所以,在 Python 3 内,将 raw_input() 重命名为 input(),这样一来,无须导入也能从标准输入获得数据了。如果您需要保留版本 2.x 的 input() 功能,可以使用 eval(input()),效果基本相同。
3、can't use a string pattern on a bytes-like object
3.0现在的参数更改了,现在读取的是bytes-like的,但参数要求是chart-like的,故定义pattern的时候在前面加一个小b,表示要操作的对象是bytes类型就可以了,,如
- url = "http://music.baidu.com/album/all?order=time&style=pop"
- html = urllib.request.urlopen(url).read()
- uri = re.findall(b'/song/d+',html,re.M)
s.encode(encoding) -> bytes
b.decode(encoding) -> str
bytes 就是一堆字节,str 是字符串;你把字符串按某种编码编码之后就成了一堆字节,正确地解码后就成了字符串。
eg1:
# apps.append(apk.split(":")[-1].split("=")[0])报错:TypeError: 'str' does not support the buffer interface
按照下面做一个转换,就fix了
s=apk.decode("GBK").split(":")[-1].split("=")[0]
apps.append(s)
eg2:
out = shell("dumpsys window w | %s \/ | %s name=" %(find_util, find_util)).stdout.read()
return pattern.findall(out)[0]
报错:can't use a string pattern on a bytes-like object
按照下面做一个转换,就fix了
out = shell("dumpsys window w | %s \/ | %s name=" %(find_util, find_util)).stdout.read().decode("GBK")