1、1、datetime:Python处理日期和时间的标准库引入方法:from datetime import datetime。第一个datetime是模块,第二个datetime是类。 如果仅导入import datetime,则必须引用全名datetime.datetime。 获取当前日期和时间:datetime.now() 加减当前时间:now+timedelta(days=2,hours=12)datetime-timestamp:fromdatetimeimportdatetimedt=datetime(2015,4,19,12,20)#用指定日期时间创建datetimedt.time
2、stamp()#把timestamp转换为datetime1429417200.0 # Python的timestamp是一个浮点数。如果有小数位,小数位表示毫秒数。 某些编程语言(如Java和JavaScript)的timestamp使用整数表示毫秒数,这种情况下只需要把timestamp除以1000就得到Python的浮点表示方法。datetime-strdatetime-UTC时间时区转化存储datetime,最佳方法是将其转换为timestamp再存储,因为timestamp的值与时区完全无关。2、collections: Python内建的一个集合模块,提供了许多有用的集合类。 na
3、medtuple: 创建一个自定义的tuple对象fromcollectionsimportnamedtuplePoint=namedtuple(Point,x,y)p=Point(1,2)p.x1 deque: 为了高效实现插入和删除操作的双向列表,适合用于队列和栈fromcollectionsimportdequeq=deque(a,b,c)q.append(x)q.appendleft(y)qdeque(y,a,b,c,x)q.pop()qdeque(y,a,b,c)q.popleft()qdeque( a,b,c) defaultdict:使用dict时,如果引用的Key不存在,就会抛
4、出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdictfromcollectionsimportdefaultdictdd=defaultdict(lambda:N/A)ddkey1=abcddkey1#key1存在abcddkey2#key2不存在,返回默认值N/A OrderedDict:保持Key的顺序,可以用OrderedDict(按插入序)。OrderedDict可以实现一个FIFO(先进先出)的dict,当容量超出限制时,先删除最早添加的KeyfromcollectionsimportOrderedDictd=dict(a,1),(b,2),(c
5、,3)d#dict的Key是无序的a:1,c:3,b:2od=OrderedDict(a,1),(b,2),(c,3)od#OrderedDict的Key是有序的OrderedDict(a,1),(b,2),(c,3) Counter:计数器,也是dict的子类,如统计字母出现的次数,类似于WordcountfromcollectionsimportCounterc=Counterc(Programming)Counter(r:2,m:2,g:2,P:1,a:1,o:1,i:1,n:1)3、base64: 用64个字符来表示任意二进制数据.Base64是一种任意二进制到文本字符串的编码方法,常
6、用于在URL、Cookie、网页中传输少量二进制数据。4、struct: 解决bytes和其他二进制数据类型的转换。Windows的位图文件(.bmp)是一种非常简单的文件格式,可以用struct分析出其文件头结构。两个字节:BM表示Windows位图,BA表示OS/2位图;一个4字节整数:表示位图大小;一个4字节整数:保留位,始终为0;一个4字节整数:实际图像的偏移量;一个4字节整数:Header的字节数;一个4字节整数:图像宽度;一个4字节整数:图像高度;一个2字节整数:始终为1;一个2字节整数:颜色数。通过分析位图文件的文件头结构,可以检查任意文件是否是位图文件struct.unpack
7、(forkey,groupinitertools.groupby(AAABBBCCAAA):. print(key,list(group).AA,A,ABB,B,BCC,CAA,A,A小结:itertools模块提供的全部是处理迭代功能的函数,它们的返回值不是list,而是Iterator,只有用for循环迭代的时候才真正计算。7、XML:Python解析XML(DOM和SAX)DOM会把整个XML读入内存,解析为树,因此占用内存大,解析慢,优点是可以任意遍历树的节点。SAX是流模式,边读边解析,占用内存小,解析快,缺点是我们需要自己处理事件。正常情况下,优先考虑SAX,因为DOM实在太占内存
8、。 Python利用SAX解析XML(关心的事件:start_element,end_element和char_data):fromxml.parsers.expatimportParserCreateclassDefaultSaxHandler(object): defstart_element(self,name,attrs): print(sax:start_element:%s,attrs:%s%(name,str(attrs) defend_element(self,name): print(sax:end_element:%s%name) defchar_data(self,tex
9、t): print(sax:char_data:%s%text)xml=r Python Rubyhandler=DefaultSaxHandler()parser=ParserCreate()parser.StartElementHandler=handler.start_elementparser.EndElementHandler=handler.end_elementparser.CharacterDataHandler=handler.char_dataparser.Parse(xml) 生成XML:拼接字符串、JSONL= #listL.append(r)L.append(r)L.
10、append(encode(some&data)L.append(r)return.join(L) #str8、HTMLParser编写一个搜索引擎: 用爬虫吧目标网站页面抓下来 解析该HTML页面fromhtml.parserimportHTMLParserfromhtml.entitiesimportname2codepointclassMyHTMLParser(HTMLParser): defhandle_starttag(self,tag,attrs): print(%tag) defhandle_endtag(self,tag): print(%tag) defhandle_star
11、tendtag(self,tag,attrs): print(%tag) defhandle_data(self,data): print(data) defhandle_comment(self,data): print() defhandle_entityref(self,name): #特殊字符 print(&%s;%name) defhandle_charref(self,name): #特殊字符 print(%s;%name)parser=MyHTMLParser()parser.feed( SomehtmlHTML tutorial.END)9、urllib:提供一系
12、列用于操作URL的功能 Get(下载)#模拟iPhone 6去请求豆瓣首页fromurllibimportrequestreq=request.Request(req.add_header(User-Agent,Mozilla/6.0(iPhone;CPUiPhoneOS8_0likeMacOSX)AppleWebKit/536.26(KHTML,likeGecko)Version/8.0Mobile/10A5376eSafari/8536.25)#不添加该header时,表示对以上页面进行抓取(查看该页面打开时返回的值),添加了该header,表示 模拟iPhone 6去请求豆瓣首页with
13、request.urlopen(req)asf: #用request方式打开URL,将返回值标记为f print(Status:,f.status,f.reason) fork,vinf.getheaders(): print(%s:%s%(k,v) print(Data:,f.read().decode(utf-8) Post(上传): 如果要以POST发送一个请求,只需要把参数data以bytes形式传入。#模拟微博登录fromurllibimportrequest,parseprint(Loginto.)email=input(Email:)passwd=input(Password:)
14、login_data=parse.urlencode( (username,email), (password,passwd), (entry,mweibo), (client_id,), (savestate,1), (ec,), (pagerefer,)req=request.Request(req.add_header(Origin,)req.add_header(User-Agent,Mozilla/6.0(iPhone;CPUiPhoneOS8_0likeMacOSX)AppleWebKit/536.26(KHTML,likeGecko)Version/8.0Mobile/10A53
15、76eSafari/8536.25)req.add_header(Referer,withrequest.urlopen(req,data=login_data.encode(utf-8)asf: print(Status:,f.status,f.reason) fork,vinf.getheaders(): print(%s:%s%(k,v) print(Data:,f.read().decode(utf-8) #en加de解 Handler:通过一个Proxy去访问网站,我们需要利用ProxyHandler来处理小结:urllib提供的功能就是利用程序去执行各种HTTP请求。如果要模拟浏览器完成特定功能,需要把请求伪装成浏览器。伪装的方法是先监控浏览器发出的请求,再根据浏览器的请求头来伪装,User-Agent头就是用来标识浏览器的。