python入门系列(4) -- python常见应用
計算器、字符編碼
計算器
掌握了python的基本語法后,可以使用python shell來代替各平臺帶的計算器了
>>> (50-5*6)/4.0 # 數學表達式 5.0 >>> a=100 >>> hex(a) # 十六進制 '0x64' >>> oct(a) # 八進制 '0144' >>> import math >>> math.cos(math.pi / 4.0) 0.70710678118654757 >>> math.log(1024, 2) 10.0 >>> math.pow(2,3) 8.0編碼轉換
- 查看ascii碼值
文本處理
簡單的解析可以使用正則表達式來,第3章已經舉了個解析objective-c獲取類中屬性的例子。
正則對多重嵌套的處理會有問題,如html中<table>又有一個table,那解析就會亂掉。這時就要用更專門的庫了來解析html了,如BeautifulSoup就比較方便,可以用它做爬蟲什么的。
demo
展示把幾個簡單的java類的定義轉換成objective-c的類定義。
測試網絡發包
- 使用pcurl構造http get、post請求,在第3章中已經給了例子
- 使用struct的pack、unpack快速生成、解析網絡包
其中,類型對照如下:
wxPython編寫gui程序
wxwidgets是一個跨平臺的GUI庫,與qt類似,現在比qt活躍。wxPython是python對應的庫。一個簡單的窗口如下
import wx app = wx.PySimpleApp() frame = wx.Frame( None, -1, '' ) frame.SetToolTip( wx.ToolTip( 'This is a frame' ) ) frame.SetCursor( wx.StockCursor( wx.CURSOR_MAGNIFIER ) ) frame.SetPosition( wx.Point( 0, 0 ) ) frame.SetSize( wx.Size( 300, 250 ) ) frame.SetTitle( 'simple2.py' ) frame.Show() app.MainLoop()Django部署網站
Django是python的web框架。有了它,就可以使用python來寫網頁了?,F在很多人已經開始用它來部署網站了,如國內新浪云SAE,就同時支持php建站和django建站。
有興趣可以玩下。
sphinx-doc編寫文檔
sphinx-doc是一種基于python的文檔編寫工具。python的官方幫助文檔就是使用它編寫的(本文也是哈)。 sphinx-doc是reStructuredText,即使用帶有簡單語法的文本文件
來編寫文件,然后通過編譯,可以生成html,epub,man,pdf等多種格式。
plain text VS. WYSIWYG
使用文本文件編寫,再使用工具編譯生成文檔(tex,docbook,sphinx都可算這個陣營),和所見即所得(微軟的word,mac的page等)的編寫方式相比有啥優缺點呢?
優點
- 開源跨平臺,文本文件任何平臺都可以打開,編譯工具也可以在任何平臺運行
- 能產生多種格式的文檔,甚至可以簡單地轉為博客的markdown語法
- 能夠生成html等格式,便于發布交流,如發到網上,大家都可以看到了
- 由于是文本,方便版本控制,也可以加注釋,多人編寫、合并文檔更方便
- WYSIWYG的編寫,如果加載圖片多了,會導致越來越卡,而plain text只是include一個文件,編譯后才會加載
- 基于網頁的技術可以方便地調整文檔格式,編寫時可以更加注重內容
- 插件較多,如特別適合各種代碼的插入、語法高亮等
缺點
- 沒有WYSIWYG直觀,只能編譯后才能生成實際的文檔,才能看到效果
- 國內用的人比較少
sphinx-doc的安裝
使用pip安裝sphinx
pip install sphinxsphinx使用
官方文檔: http://sphinx-doc.org/contents.html
中譯文地址: http://zh-sphinx-doc.readthedocs.org/en/latest/contents.html
demo
用sphinx創建一個文檔工程。并加入一些簡單的內容
One more thing: 爬蟲
爬蟲可以使用任何語言,如果你只是做一個簡單功能、不考慮效率的爬蟲,用腳本是最快的。有些網站的網頁相當簡單,有些甚至直接使用正則表達式就能全部匹配出想要的結果。為了讓大家對python腳本更有興趣,這里提供一個腳本,讓大家學習,它能實現從xxx網站上,批量下載種子,哈哈[種子下載站jandown如果發生變化,需要修改代碼],
# encoding:utf8 ''' Created on 2015-03-27@author: vincent '''import pycurl, urllib import StringIO import os import re import sys from optparse import OptionParserg_janDownURL=r"""http://www.jandown.com""" g_janDownFetchURL=r"""http://www.jandown.com/fetch.php""" g_janDownLinkRef=r"""http://www.jandown.com/link.php?ref="""g_fid=r"""16""" #版塊 g_ac168URL=r"""http://ac168.info/bt/thread.php?fid=%s&page=%d""" g_ac168DataURL=r"""http://ac168.info/bt/""" g_pages=1g_downloadDir=r"""c:\mybts""" g_re_item=re.compile(r'''<h3><a\shref="(htm_data.*?)" id.*?target=_blank>(?!<)''', re.S) g_re_jandown=re.compile(r'''<a href="(http://www.jandown.com.*?)"''', re.S)testURL=r"""http://www.jandown.com/link.php?ref=UgyMkq6s"""def getHtmlRead(url):c = pycurl.Curl()c.setopt(pycurl.URL, url)c.setopt(pycurl.USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)")b = StringIO.StringIO()c.setopt(pycurl.WRITEFUNCTION, b.write)c.setopt(pycurl.FOLLOWLOCATION, 1)c.setopt(pycurl.MAXREDIRS, 5) # c.setopt(pycurl.CONNECTTIMEOUT, 60) # c.setopt(pycurl.TIMEOUT, 300)try:c.perform()except Exception as e:print "html read error %s\r\n" % urlreturn Nonereturn b.getvalue()def postHtmlRead(referUrl, data):c = pycurl.Curl()c.setopt(pycurl.URL, g_janDownFetchURL)c.setopt(pycurl.USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)")b = StringIO.StringIO()c.setopt(pycurl.WRITEFUNCTION, b.write)c.setopt(pycurl.POSTFIELDS, urllib.urlencode(data))c.setopt(pycurl.FOLLOWLOCATION, 1)c.setopt(pycurl.REFERER, referUrl)# c.setopt(pycurl.HEADER, 1)# c.setopt(pycurl.CONNECTTIMEOUT, 0)c.setopt(pycurl.MAXREDIRS, 5)# c.setopt(pycurl.COOKIEJAR, "cookie.txt")try:c.perform()except Exception as e:print "html read error\r\n"return Nonereturn b.getvalue()g_total=0 def parseJanDown(url):global g_totalif url.find(g_janDownLinkRef)<-1:return Nonecode = url[len(g_janDownLinkRef)-len(url):]value = {'code':code}bt=postHtmlRead(testURL, value);if bt != None:fd=open(os.path.join(g_downloadDir, code+".torrent"), "w");fd.write(bt)fd.close()g_total+=1print "download %s.torrent complete..total %d" % (code, g_total)passdef crawlerOneItemPage(itemPageUrl): # print "crawlerOneItemPage %s" % itemPageUrlhtml=getHtmlRead(itemPageUrl)if html==None:return None# 只取一個item=re.search(g_re_jandown, html)if item != None:parseJanDown(item.groups()[0])# testPageUrl = r'''http://ac168.info/bt/thread.php?fid=16''' def crawlerPageItems(pageUrl):html=getHtmlRead(pageUrl)items=re.findall(g_re_item, html)for i in items:url=g_ac168DataURL+icrawlerOneItemPage(url)def ac168_work(pages):g_pages = pagesfor i in range(1,g_pages):pageUrl= g_ac168URL % (g_fid, i) # print pageUrlcrawlerPageItems(pageUrl)passMSG_USAGE = "python getTorrent.py [-n pages]"def main():optParser = OptionParser(MSG_USAGE)optParser.add_option("-n","--pages",action = "store",type="int",dest = "pages")options, args = optParser.parse_args()pages = 1 # if len(sys.argv)>2: # optParser.print_help() # exit()if options.pages == None:pages=1else:pages=options.pagesac168_work(pages)if __name__ == '__main__':main()用腳本爬蟲,爬href的鏈接是比較容易的,但是有些跳轉鏈接是用js實現的,這些如果要爬的話,需要解釋js,或者效率低點的做法,搞個ui,調用系統的瀏覽器控件來處理。
興趣練習
使用python編寫一個自動代碼生成器
把常用的實現某些功能的代碼歸類,tag化,以后如果要用,只要使用關鍵字進行搜索,就能把代碼提取出來。使用sphinx編寫一份教程,并發布
選一個你比較熟悉的領域,使用sphinx編寫入門教程或筆記。
總結
以上是生活随笔為你收集整理的python入门系列(4) -- python常见应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2020-12-19 nn.CrossE
- 下一篇: python中pip安装报错的一些总结