- python編碼規範
- http://google-styleguide.googlecode.com/svn/trunk/pyguide.html
- 判斷對象是否含有某屬性
if hasattr(object, 'attribute')
- 反射擷取類執行個體
globals()['ClassName']()
- python日期轉換
字串到日期:
import time
timeInDate = time.strptime(timeInStr,"%Y-%m-%d %H:%M:%S")
日期到字串:
timeInStr = time.strftime("%Y/%m/%d %H:%M:%S", time.localtime())
timeInStr = time.strftime("%Y/%m/%d %H:%M:%S", timeInDate)
- 尋找列表中的指定值
guids = []
guids.append(1)
guids.append(3)
guidTofind = 4
guidin = filter(lambda g: g==guidTofind, guids)
#不在列表中
if len(guidin)==0:
- python三元運算式
s = ('negitive', 'positive')[n >= 0]
- python靜態方法
註解式:
@staticmethod
def bar():
print Foo.str
other:
def bar():
print Foo.str
bar = staticmethod(bar)
- pylint代碼掃描規範工具Windows下安裝
pylint用於代碼自動分析,配置後eclipse設定build Automatically,每次儲存後產生報告,說明你的代碼是否符合編程規範,並給你打分(我的一份可以跑通的代碼是 -13/10 ,負13,汗顏。。。)
參考http://www.logilab.org/card/pylint_manual
但是結果仍然提示: can't open file 'D:\Python26\Scripts\pylint': [Errno 2] No such file or directory
需要開啟 D:\pylint-0.22.0\bin 目錄,然後把那裡的所有檔案拷貝到 Python 的
Scripts 目錄下( 如:D:\Python26\Scripts)
在命令列嘗試執行 pylint,如果輸出協助,則表示已經安裝成功
pylint預設的規範不符合駝峰方式的變數和方法命名方式 可視需要建立一份公用conf檔案 確定變數和方法的Regex
配置草案: pylint.conf
可添加到eclipse=>Window=>preferences=>Pydev=>Pylint
use Pylint勾上,location of pylint填入下載包pylint的本地路徑 D:\develop\pylint\pylint-0.22.0\lint.py
arguments框裡填入: --rcfile=C:\Python26\Scripts\pylint.conf
- 檢測檔案是否存在
import os.path
os.path.isfile(fname)
- post xml by http request
import httplib, urllib
params = urllib.urlencode( \
{'parameter': pValue, "p":valuep})
headers = { "Content-type": "text/xml,charset=utf-8"}
conn = httplib.HTTPConnection(self.webHost+":"+self.webPort)
conn.request("POST", "/"+self.webPath+"/?"+params, content , headers)
response = conn.getresponse()
print response.status, response.reason
print response.read()
conn.close()
- cherrypy 訪問靜態資源
html css js 圖片等資源的存取方法:
cherryd -i cpapp -c prod.conf
cherrypy.quickstart(Root(), '/', config=conf)
詳見: http://www.cherrypy.org/wiki/StaticContent
- python binding cpp
boost方式:
建立hello.cpp char const* greet(unsigned x)
{
static char const* const msgs[] = { "hello", "Boost.Python", "world!" };
if (x > 2)
return "nothing";
return msgs[x];
}
binding用的cpp hello_wrap.cpp
#include
#include
using namespace boost::python;
char const* greet(unsigned x);
BOOST_PYTHON_MODULE(hello)
{
def("greet", greet, "return one of 3 parts of a greeting");
}
編譯:
sudo g++ -lpython2.5 -lboost_python -I/usr/include/python2.5 hello.cpp hello_wrap.cpp -shared -o hello.so
在目前的目錄下產生hello.so檔案 python 命令列 :
>>>import hello
>>> print hello.greet(1)
Boost.Python
>>>
python ctypes方式: http://blogold.chinaunix.net/u/21908/showart_2225882.html
- Python 中的 True
在 2.2.1 版本之前,Python 沒有單獨的布林值資料型別。為了彌補這個缺陷,Python 在布爾環境 (如 if 語句) 中幾乎接受所有東西,遵循下面的規則:
• 0 為 false; 其它所有數值皆為 true。
• 空串 ("") 為 false; 其它所有字串皆為 true。
• 空 list ([]) 為 false; 其它所有 list 皆為 true。
• 空 tuple (()) 為 false; 其它所有 tuple 皆為 true。
• 空 dictionary ({}) 為 false; 其它所有 dictionary 皆為 true。
這些規則仍然適用於 Python 2.2.1 及其後續版本,但現在您也可以使用真正的布爾值,它的值或者為 True 或者為 False。請注意第一個字母是大寫的;這些值如同在 Python 中的其它東西一樣都是大小寫敏感的。
- python進程異常終止問題
可能原因:cmd調用出錯 記憶體塊讀取錯誤 程式錯誤
項目中遇到是程式錯誤 沒有進行except擷取引起 例如
i = 1
while True:
i = i+1
if i==100:
i/0出現除0錯誤 則進程終止
def test():
i = 1
while True:
i = i+1
print [c.name for c in messages.columns]
if i==100:
i/0
try:
test()
except Exception:
print Exception
函數內部不捕獲 由外圍捕獲 也會造成進程終止
- 假設當前項目有幾個檔案夾(core,domain,util)的類需要安裝到python中
建立setup.py
from setuptools import setup
setup(name='scservice',
version='0.1.0',
description="Easy python framework for sc service",
packages = ['core','domain','util'],
platforms = 'any',
keywords='framework for sc service',
author='shen guanpu',
author_email='shenguanpu@netqin.com',
url='www.netqin.com',
license='(c) 2010 NetQin',
include_package_data=True,
zip_safe=False,
)
正常情況下packages應該寫項目名稱 或者僅安裝項目的幾個模組 則 packages = ['scservice.core','scservice.domain','scservice.util'],sudo python setup.py develop 可建立連結檔案,如果svn有更新 可update下來 不需要再運行安裝即可使用
sudo python setup.py install 則直接安裝幾個檔案夾到 /python/lib/site-packages之下
測試: 進入python 命令列:
from core.rule import Rule
不報錯說明安裝成功
- str 為何可用for遍曆?(from python mail list)
str 沒有像list一樣提供__iter__()方法,不能產生迭代對象,但卻可用for 去遍曆
原因是:
Python's for statement iterates over the items of any sequence (a list
or a string), in the order that they appear in the sequence.for針對的是sequence,只要是sequence,它都能處理。
sequence protocol在這裡有定義:
http://docs.python.org/library/functions.html#iter
the __getitem__() method with integer arguments starting at 0
也就是說,只要有__getitem__方法,都算是sequence,for都能處理。
驗證一下:
class A(object):
def __getitem__(self, item):
print 'getitem:', item
if item == 5:
raise IndexError()
return item
for i in A():
print i
- dict list轉換
構建空值的dict dict.fromkeys([1,2,3]) => {1:None,2:None,3:None}
構建dict dict([(1,2),(2,3)]) => {1:2, 2:3}
從dict的key 構建list list( {1:2, 2:3}) => [1,2] or {1:2, 2:3}.keys()
從dict的value構建list [j for i,j in {1:2, 2:3}.iteritems()]
- 安裝python
wget http://www.python.org/ftp/python/2.6.5/Python-2.6.5.tar.bz2
解壓: $bzip2 -d Python-2.5.2.tar.bz2
$ tar -xvf Python-2.5.2.tar
轉移位置:
$ mv Python-2.6.5 /usr/local/
l 安裝
$ cd Python-2.6.5
$ ./configure
$ make
$ make install
l 如果預設版本沒有被替換 則需建立軟連結
$cd /usr/bin
$ll |grep python //查看該目錄下python
$rm -rf python
$ln -s /usr/local/Python-2.6.5/python ./python //軟連結
- 檢查變數是否defined
a = 1
if a in dir()
Pycurl 綁定到特定的IP地址
def iptest(ip) :
c = pycurl.Curl()
c.setopt(c.URL, "http://www.ip138.com/ip2city.asp")
# 綁定到特定的IP地址
c.setopt(pycurl.INTERFACE,ip)
c.perform()
c.fp = StringIO.StringIO()
print c.fp.getvalue()
c.close()
- python 多進程中使用random隨機數
Linux的fork是寫複製的,即fork出來的進程只有修改了的部分才另外開闢記憶體;而隨機數是根據
種子數值得出的偽隨機數,fork出來的進程的種子相同,所以數值相同。因此每次做完random後,
需要random.seed(),這樣能產生新的隨機數
def executeChangeable():
pid = os.getpid()
random.seed()
randpart = random.randint(10000000, 99999999)
return pid, randpart
uuid方式:
>>> import uuid
# make a random UUID
>>> uuid.uuid4()
UUID('16fd2706-8baf-433b-82eb-8c7fada847da')
- python抓取http代理
def getproxycn():
portDict = {"R":"8","D":"0","C":"1","M":"4","Z":"3","K":"2","I":"7","L":"9","B":"5","W":"6"};
pagenum = 0
num = 0;
proxyfile = "proxys.txt"
file = open(proxyfile,"w+");
while pagenum <= 9:
url='http://www.cnproxy.com/proxy'+str(pagenum + 1)+'.html'
html=urllib2.urlopen(url)
for line in html:
if "HTTP" in line:
arra = line.upper().split("<TR><TD>")
arrb = arra[1].split("<SCRIPT TYPE=TEXT/JAVASCRIPT>")
ip = arrb[0]
port = arrb[1].split(")</SCRIPT>")[0].split("DOCUMENT.WRITE(\":\"")[1]
port = port.replace("+","");
p = "";
for i in range(len(port)):
alph = port[i:i+1]
p += portDict[alph];
print ip + ":" + p
file.write(ip+":"+p+"\n")
num += 1;
pagenum += 1;
file.close();
print "已處理代理總條數 : " + str(num)