原文地址:http://hi.baidu.com/quanzhou722/item/cf4471f8e23d3149932af2a7
實在是太好的資料了,不得不轉
python例項手冊 #encoding:utf8 # 設定編碼-支援中文 0說明 手冊製作: 雪松 更新日期: 2013-12-19 歡迎系統運維加入Q群: 198173206 # 加群請回答問題 請使用"notepad++"開啟此文件,"alt+0"將函式摺疊後方便查閱 請勿刪除資訊,轉載請說明出處,抵制不道德行為。 錯誤在所難免,還望指正! # python例項手冊下載地址: http://hi.baidu.com/quanzhou722/item/cf4471f8e23d3149932af2a7 # shell例項手冊最新下載地址: http://hi.baidu.com/quanzhou722/item/f4a4f3c9eb37f02d46d5c0d9 # LazyManage運維批量管理軟體下載(shell): http://hi.baidu.com/quanzhou722/item/4ccf7e88a877eaccef083d1a 檢視幫助 import os for i in dir(os): print i # 模組的方法 help(os.path) # 方法的幫助 變數 r=r'\n' # 輸出時原型列印 u=u'中文' # 定義為unicode編碼 global x # 全域性變數 a = 0 or 2 or 1 # 布林運算賦值,a值為True既不處理後面,a值為2. None、字串''、空元組()、空列表[],空字典{}、0、空字串都是false name = raw_input("input:").strip() # 輸入字串變數 num = int(raw_input("input:").strip()) # 輸入字串str轉為int型 locals() # 所有區域性變數組成的字典 locals().values() # 所有區域性變數值的列表 os.popen("date -d @{0} +'%Y-%m-%d %H:%M:%S'".format(12)).read() # 特殊情況引用變數 {0} 代表第一個引數 列印 # 字串 %s 整數 %d 浮點 %f 原樣列印 %r print '字串: %s 整數: %d 浮點: %f 原樣列印: %r' % ('aa',2,1.0,'r') print 'abc', # 有逗號,代表不換行列印,在次列印會接著本行列印 列表 # 列表元素的個數最多 536870912 shoplist = ['apple', 'mango', 'carrot', 'banana'] shoplist[2] = 'aa' del shoplist[0] shoplist.insert('4','www') shoplist.append('aaa') shoplist[::-1] # 倒著列印 對字元翻轉串有效 元組 # 不可變 zoo = ('wolf', 'elephant', 'penguin') 字典 ab = { 'Swaroop' : 'swaroopch@byteofpython.info', 'Larry' : 'larry@wall.org', } ab['c'] = 80 # 新增字典元素 del ab['Larry'] # 刪除字典元素 ab.keys() # 檢視所有鍵值 ab.values() # 列印所有值 ab.has_key('a') # 檢視鍵值是否存在 ab.items() # 返回整個字典列表 流程結構 if判斷 # 布林值操作符 and or not 實現多重判斷 if a == b: print '==' elif a < b: print b else: print a fi while迴圈 while True: if a == b: print "==" break print "!=" else: print 'over' count=0 while(count<9): print count count += 1 for迴圈 sorted() # 返回一個序列(列表) zip() # 返回一個序列(列表) enumerate() # 返回迭代器(類似序列) reversed() # 反序迭代器物件 dict.iterkeys() # 通過鍵迭代 dict.itervalues() # 通過值迭代 dict.iteritems() # 通過鍵-值對迭代 randline() # 檔案迭代 iter(obj) # 得到obj迭代器 檢查obj是不是一個序列 iter(a,b) # 重複呼叫a,直到迭代器的下一個值等於b for i in range(1, 5): print i else: print 'over' list = ['a','b','c','b'] for i in range(len(list)): print list[i] for x, Lee in enumerate(list): print "%d %s Lee" % (x+1,Lee) 流程結構簡寫 [ i * 2 for i in [8,-2,5]] [16,-4,10] [ i for i in range(8) if i %2 == 0 ] [0,2,4,6] tab補全 # vim /usr/lib/python2.7/dist-packages/tab.py # python startup file import sys import readline import rlcompleter import atexit import os # tab completion readline.parse_and_bind('tab: complete') # history file histfile = os.path.join(os.environ['HOME'], '.pythonhistory') 函式 def printMax(a, b = 1): if a > b: print a return a else: print b return b x = 5 y = 7 printMax(x, y) 模組 # Filename: mymodule.py def sayhi(): print 'mymodule' version = '0.1' # 匯入模組 import mymodule from mymodule import sayhi, version # 使用模組中函式 mymodule.sayhi() 取引數 import sys for i in sys.argv: print i 物件的方法 class Person: # 例項化初始化的方法 def __init__(self, name ,age): self.name = name self.age = age print self.name # 有self此函式為方法 def sayHi(self): print 'Hello, my name is', self.name #物件消逝的時候被呼叫 def __del__(self): print 'over' # 例項化物件 p = Person('Swaroop') # 使用物件方法 p.sayHi() # 繼承 class Teacher(Person): def __init__(self, name, age, salary): Person.__init__(self, name, age) self.salary = salary print '(Initialized Teacher: %s)' % self.name def tell(self): Person.tell(self) print 'Salary: "%d"' % self.salary t = Teacher('Mrs. Shrividya', 40, 30000) 檔案處理 # 模式: 讀'r' 寫'w' 追加'a' 讀寫'r+' 二進位制檔案'b' 'rb','wb','rb+' 寫檔案 f = file('poem.txt', 'w') f.write("string") f.write(str(i)) f.flush() f.close() 讀檔案 f = file('/etc/passwd','r') while True: line = f.readline() # 返回一行 if len(line) == 0: break x = line.split(":") # 冒號分割定義序列 #x = [ x for x in line.split(":") ] # 冒號分割定義序列 #x = [ x.split("/") for x in line.split(":") ] # 先冒號分割,在/分割 列印x[6][1] print x[6],"\n", f.close() 讀檔案2 f = file('/etc/passwd') c = f.readlines() # 讀入所以檔案內容,可反覆讀取,大檔案時佔用記憶體較大 for line in c: print line.rstrip(), f.close() 讀檔案3 for i in open('b.txt'): # 直接讀取也可迭代,並有利於大檔案讀取,但不可反覆讀取 print i, 追加日誌 log = open('/home/peterli/xuesong','a') print >> log,'faaa' log.close() with讀檔案 with open('a.txt') as f: # print f.read() # 列印所有內容為字串 print f.readlines() # 列印所有內容按行分割的列表 csv讀配置檔案 192.168.1.5,web # 配置檔案按逗號分割 list = csv.reader(file('a.txt')) for line in list: print line # ['192.168.1.5', 'web'] 觸發異常 class ShortInputException(Exception): '''A user-defined exception class.''' def __init__(self, length, atleast): Exception.__init__(self) self.length = length self.atleast = atleast try: s = raw_input('Enter something --> ') if len(s) < 3: raise ShortInputException(len(s), 3) except EOFError: print '\nWhy did you do an EOF on me?' except ShortInputException, x: print 'ShortInputException: The input was of length %d, \ was expecting at least %d' % (x.length, x.atleast) else: print 'No exception was raised.' 內建函式 dir(sys) # 顯示物件的屬性 help(sys) # 互動式幫助 int(obj) # 轉型為整形 str(obj) # 轉為字串 len(obj) # 返回物件或序列長度 open(file,mode) # 開啟檔案 #mode (r 讀,w 寫, a追加) range(0,3) # 返回一個整形列表 raw_input("str:") # 等待使用者輸入 type(obj) # 返回物件型別 abs(-22) # 絕對值 random # 隨機數 random.randrange(9) # 9以內隨機數 choice() # 隨機返回給定序列的一個元素 divmod(x,y) # 函式完成除法運算,返回商和餘數。 isinstance(object,int) # 測試物件型別 int round(x[,n]) # 函式返回浮點數x的四捨五入值,如給出n值,則代表舍入到小數點後的位數 xrange() # 函式與range()類似,但xrnage()並不建立列表,而是返回一個xrange物件 xrange([lower,]stop[,step]) strip() # 是去掉字串兩端多於空格,該句是去除序列中的所有字串兩端多餘的空格 del # 刪除列表裡面的資料 cmp(x,y) # 比較兩個物件 #根據比較結果返回一個整數,如果x<y,則返回-1;如果x>y,則返回1,如果x==y則返回0 max() # 字串中最大的字元 min() # 字串中最小的字元 sorted() # 對序列排序 reversed() # 對序列倒序 enumerate() # 返回索引位置和對應的值 sum() # 總和 list() # 變成列表可用於迭代 tuple() # 變成元組可用於迭代 #一旦初始化便不能更改的資料結構,速度比list快 zip() # 返回一個列表 >>> s = ['11','22','33'] >>> t = ['aa','bb','cc'] >>> zip(s,t) [('11', 'aa'), ('22', 'bb'), ('33', 'cc')] 字串相關模組 string # 字串操作相關函式和工具 re # 正規表示式 struct # 字串和二進位制之間的轉換 c/StringIO # 字串緩衝物件,操作方法類似於file物件 base64 # Base16\32\64資料編解碼 codecs # 解碼器註冊和基類 crypt # 進行單方面加密 difflib # 找出序列間的不同 hashlib # 多種不同安全雜湊演算法和資訊摘要演算法的API hma # HMAC資訊鑑權演算法的python實現 md5 # RSA的MD5資訊摘要鑑權 rotor # 提供多平臺的加解密服務 sha # NIAT的安全雜湊演算法SHA stringprep # 提供用於IP協議的Unicode字串 textwrap # 文字包裝和填充 unicodedate # unicode資料庫 列表型別內建函式 list.append(obj) # 向列表中新增一個物件obj list.count(obj) # 返回一個物件obj在列表中出現的次數 list.extend(seq) # 把序列seq的內容新增到列表中 list.index(obj,i=0,j=len(list)) # 返回list[k] == obj 的k值,並且k的範圍在i<=k<j;否則異常 list.insert(index.obj) # 在索引量為index的位置插入物件obj list.pop(index=-1) # 刪除並返回指定位置的物件,預設是最後一個物件 list.remove(obj) # 從列表中刪除物件obj list.reverse() # 原地翻轉列表 list.sort(func=None,key=None,reverse=False) # 以指定的方式排序列表中成員,如果func和key引數指定,則按照指定的方式比較各個元素,如果reverse標誌被置為True,則列表以反序排列 序列型別操作符 seq[ind] # 獲取下標為ind的元素 seq[ind1:ind2] # 獲得下標從ind1到ind2的元素集合 seq * expr # 序列重複expr次 seq1 + seq2 # 連線seq1和seq2 obj in seq # 判斷obj元素是否包含在seq中 obj not in seq # 判斷obj元素是否不包含在seq中 字串型別內建方法 string.expandtabs(tabsize=8) # tab符號轉為空格 #預設8個空格 string.endswith(obj,beg=0,end=len(staring)) # 檢測字串是否已obj結束,如果是返回True #如果beg或end指定檢測範圍是否已obj結束 string.count(str,beg=0,end=len(string)) # 檢測str在string裡出現次數 string.find(str,beg=0,end=len(string)) # 檢測str是否包含在string中 string.index(str,beg=0,end=len(string)) # 檢測str不在string中,會報異常 string.isalnum() # 如果string至少有一個字元並且所有字元都是字母或數字則返回True string.isalpha() # 如果string至少有一個字元並且所有字元都是字母則返回True string.isnumeric() # 如果string只包含數字字元,則返回True string.isspace() # 如果string包含空格則返回True string.isupper() # 字串都是大寫返回True string.islower() # 字串都是小寫返回True string.lower() # 轉換字串中所有大寫為小寫 string.upper() # 轉換字串中所有小寫為大寫 string.lstrip() # 去掉string左邊的空格 string.rstrip() # 去掉string字元末尾的空格 string.replace(str1,str2,num=string.count(str1)) # 把string中的str1替換成str2,如果num指定,則替換不超過num次 string.startswith(obj,beg=0,end=len(string)) # 檢測字串是否以obj開頭 string.zfill(width) # 返回字元長度為width的字元,原字串右對齊,前面填充0 string.isdigit() # 只包含數字返回True string.split("分隔符") # 把string切片成一個列表 ":".join(string.split()) # 以:作為分隔符,將所有元素合併為一個新的字串 序列型別相關的模組 array # 一種受限制的可變序列型別,元素必須相同型別 copy # 提供淺拷貝和深拷貝的能力 operator # 包含函式呼叫形式的序列操作符 operator.concat(m,n) re # perl風格的正規表示式查詢 StringIO # 把長字串作為檔案來操作 如: read() \ seek() cStringIO # 把長字串作為檔案來操,作速度更快,但不能被繼承 textwrap # 用作包裝/填充文字的函式,也有一個類 types # 包含python支援的所有型別 collections # 高效能容器資料型別 字典相關函式 dict([container]) # 建立字典的工廠函式。提供容器類(container),就用其中的條目填充字典 len(mapping) # 返回對映的長度(鍵-值對的個數) hash(obj) # 返回obj雜湊值,判斷某個物件是否可做一個字典的鍵值 字典內建方法 dict.clear() # 刪除字典中所有元素 dict copy() # 返回字典(淺複製)的一個副本 dict.fromkeys(seq,val=None) # 建立並返回一個新字典,以seq中的元素做該字典的鍵,val做該字典中所有鍵對的初始值 dict.get(key,default=None) # 對字典dict中的鍵key,返回它對應的值value,如果字典中不存在此鍵,則返回default值 dict.has_key(key) # 如果鍵在字典中存在,則返回True 用in和not in代替 dicr.items() # 返回一個包含字典中鍵、值對元組的列表 dict.keys() # 返回一個包含字典中鍵的列表 dict.iter() # 方法iteritems()、iterkeys()、itervalues()與它們對應的非迭代方法一樣,不同的是它們返回一個迭代子,而不是一個列表 dict.pop(key[,default]) # 和方法get()相似.如果字典中key鍵存在,刪除並返回dict[key] dict.setdefault(key,default=None) # 和set()相似,但如果字典中不存在key鍵,由dict[key]=default為它賦值 dict.update(dict2) # 將字典dict2的鍵值對新增到字典dict dict.values() # 返回一個包含字典中所有值得列表 集合方法 s.issubset(t) # 如果s是t的子集,則返回True s <= t s.issuperset(t) # 如果t是s的超集,則返回True s >= t s.union(t) # 合併操作;返回一個新集合,該集合是s和t的並集 s | t s.intersection(t) # 交集操作;返回一個新集合,該集合是s和t的交集 s & t s.difference(t) # 返回一個新集合,改集合是s的成員,但不是t的成員 s - t s.symmetric_difference(t) # 返回一個新集合,該集合是s或t的成員,但不是s和t共有的成員 s ^ t s.copy() # 返回一個新集合,它是集合s的淺複製 obj in s # 成員測試;obj是s中的元素 返回True obj not in s # 非成員測試:obj不是s中元素 返回True s == t # 等價測試 是否具有相同元素 s != t # 不等價測試 s < t # 子集測試;s!=t且s中所有元素都是t的成員 s > t # 超集測試;s!=t且t中所有元素都是s的成員 可變集合方法 s.update(t) # 用t中的元素修改s,s現在包含s或t的成員 s |= t s.intersection_update(t) # s中的成員是共用屬於s和t的元素 s &= t s.difference_update(t) # s中的成員是屬於s但不包含在t中的元素 s -= t s.symmetric_difference_update(t) # s中的成員更新為那些包含在s或t中,但不是s和t共有的元素 s ^= t s.add(obj) # 在集合s中新增物件obj s.remove(obj) # 從集合s中刪除物件obj;如果obj不是集合s中的元素(obj not in s),將引發KeyError錯誤 s.discard(obj) # 如果obj是集合s中的元素,從集合s中刪除物件obj s.pop() # 刪除集合s中的任意一個物件,並返回它 s.clear() # 刪除集合s中的所有元素 序列化 #!/usr/bin/python import cPickle obj = {'1':['4124','1241','124'],'2':['12412','142','1241']} pkl_file = open('account.pkl','wb') cPickle.down(obj,pkl_file) pkl_file.close() pkl_file = open('account.pkl','rb') account_list = cPickle.load(pkl_file) pkl_file.close() 檔案物件方法 file.close() # 關閉檔案 file.fileno() # 返回檔案的描述符 file.flush() # 重新整理檔案的內部緩衝區 file.isatty() # 判斷file是否是一個類tty裝置 file.next() # 返回檔案的下一行,或在沒有其他行時引發StopIteration異常 file.read(size=-1) # 從檔案讀取size個位元組,當未給定size或給定負值的時候,讀取剩餘的所有位元組,然後作為字串返回 file.readline(size=-1) # 從檔案中讀取並返回一行(包括行結束符),或返回最大size個字元 file.readlines(sizhint=0) # 讀取檔案的所有行作為一個列表返回 file.xreadlines() # 用於迭代,可替換readlines()的一個更高效的方法 file.seek(off, whence=0) # 在檔案中移動檔案指標,從whence(0代表檔案起始,1代表當前位置,2代表檔案末尾)偏移off位元組 file.tell() # 返回當前在檔案中的位置 file.truncate(size=file.tell()) # 擷取檔案到最大size位元組,預設為當前檔案位置 file.write(str) # 向檔案寫入字串 file.writelines(seq) # 向檔案寫入字串序列seq;seq應該是一個返回字串的可迭代物件 檔案物件的屬性 file.closed # 表示檔案已被關閉,否則為False file.encoding # 檔案所使用的編碼 當unicode字串被寫入資料時,它將自動使用file.encoding轉換為位元組字串;若file.encoding為None時使用系統預設編碼 file.mode # Access檔案開啟時使用的訪問模式 file.name # 檔名 file.newlines # 未讀取到行分隔符時為None,只有一種行分隔符時為一個字串,當檔案有多種型別的行結束符時,則為一個包含所有當前所遇到的行結束符的列表 file.softspace # 為0表示在輸出一資料後,要加上一個空格符,1表示不加 os模組 檔案處理 mkfifo()/mknod() # 建立命名管道/建立檔案系統節點 remove()/unlink() # 刪除檔案 rename()/renames() # 重新命名檔案 *stat() # 返回檔案資訊 symlink() # 建立符號連結 utime() # 更新時間戳 tmpfile() # 建立並開啟('w+b')一個新的臨時檔案 walk() # 遍歷目錄樹下的所有檔名 目錄/資料夾 chdir()/fchdir() # 改變當前工作目錄/通過一個檔案描述符改變當前工作目錄 chroot() # 改變當前程式的根目錄 listdir() # 列出指定目錄的檔案 getcwd()/getcwdu() # 返回當前工作目錄/功能相同,但返回一個unicode物件 mkdir()/makedirs() # 建立目錄/建立多層目錄 rmdir()/removedirs() # 刪除目錄/刪除多層目錄 訪問/許可權 saccess() # 檢驗許可權模式 chmod() # 改變許可權模式 chown()/lchown() # 改變owner和groupID功能相同,但不會跟蹤連結 umask() # 設定預設許可權模式 檔案描述符操作 open() # 底層的作業系統open(對於穩健,使用標準的內建open()函式) read()/write() # 根據檔案描述符讀取/寫入資料 按大小讀取檔案部分內容 dup()/dup2() # 複製檔案描述符號/功能相同,但是複製到另一個檔案描述符 裝置號 makedev() # 從major和minor裝置號建立一個原始裝置號 major()/minor() # 從原始裝置號獲得major/minor裝置號 os.path模組 os.path.expanduser('~/.ssh/key') # 家目錄下檔案的全路徑 分隔 basename() # 去掉目錄路徑,返回檔名 dirname() # 去掉檔名,返回目錄路徑 join() # 將分離的各部分組合成一個路徑名 spllt() # 返回(dirname(),basename())元組 splitdrive() # 返回(drivename,pathname)元組 splitext() # 返回(filename,extension)元組 資訊 getatime() # 返回最近訪問時間 getctime() # 返回檔案建立時間 getmtime() # 返回最近檔案修改時間 getsize() # 返回檔案大小(位元組) 查詢 exists() # 指定路徑(檔案或目錄)是否存在 isabs() # 指定路徑是否為絕對路徑 isdir() # 指定路徑是否存在且為一個目錄 isfile() # 指定路徑是否存在且為一個檔案 islink() # 指定路徑是否存在且為一個符號連結 ismount() # 指定路徑是否存在且為一個掛載點 samefile() # 兩個路徑名是否指向同一個檔案 相關模組 base64 # 提供二進位制字串和文字字串間的編碼/解碼操作 binascii # 提供二進位制和ASCII編碼的二進位制字串間的編碼/解碼操作 bz2 # 訪問BZ2格式的壓縮檔案 csv # 訪問csv檔案(逗號分隔檔案) csv.reader(open(file)) filecmp # 用於比較目錄和檔案 fileinput # 提供多個文字檔案的行迭代器 getopt/optparse # 提供了命令列引數的解析/處理 glob/fnmatch # 提供unix樣式的萬用字元匹配的功能 gzip/zlib # 讀寫GNU zip(gzip)檔案(壓縮需要zlib模組) shutil # 提供高階檔案訪問功能 c/StringIO # 對字串物件提供類檔案介面 tarfile # 讀寫TAR歸檔檔案,支援壓縮檔案 tempfile # 建立一個臨時檔案 uu # uu格式的編碼和解碼 zipfile # 用於讀取zip歸檔檔案的工具 environ['HOME'] # 檢視系統環境變數 子程式 os.fork() # 建立子程式,並複製父程式所有操作 通過判斷pid = os.fork() 的pid值,分別執行父程式與子程式操作,0為子程式 os.wait() # 等待子程式結束 跨平臺os模組屬性 linesep # 用於在檔案中分隔行的字串 sep # 用來分隔檔案路徑名字的字串 pathsep # 用於分割檔案路徑的字串 curdir # 當前工作目錄的字串名稱 pardir # 父目錄字串名稱 異常 NameError: # 嘗試訪問一個未申明的變數 ZeroDivisionError: # 除數為零 SyntaxErrot: # 直譯器語法錯誤 IndexError: # 請求的索引元素超出序列範圍 KeyError: # 請求一個不存在的字典關鍵字 IOError: # 輸入/輸出錯誤 AttributeError: # 嘗試訪問未知的物件屬性 ImportError # 沒有模組 IndentationError # 語法縮排錯誤 KeyboardInterrupt # ctrl+C SyntaxError # 程式碼語法錯誤 ValueError # 值錯誤 TypeError # 傳入物件型別與要求不符合 觸發異常 raise exclass # 觸發異常,從exclass生成一個例項(不含任何異常引數) raise exclass() # 觸發異常,但現在不是類;通過函式呼叫操作符(function calloperator:"()")作用於類名生成一個新的exclass例項,同樣也沒有異常引數 raise exclass, args # 觸發異常,但同時提供的異常引數args,可以是一個引數也可以是元組 raise exclass(args) # 觸發異常,同上 raise exclass, args, tb # 觸發異常,但提供一個跟蹤記錄(traceback)物件tb供使用 raise exclass,instance # 通過例項觸發異常(通常是exclass的例項) raise instance # 通過例項觸發異常;異常型別是例項的型別:等價於raise instance.__class__, instance raise string # 觸發字串異常 raise string, srgs # 觸發字串異常,但觸發伴隨著args raise string,args,tb # 觸發字串異常,但提供一個跟蹤記錄(traceback)物件tb供使用 raise # 重新觸發前一個異常,如果之前沒有異常,觸發TypeError 內建異常 BaseException # 所有異常的基類 SystemExit # python直譯器請求退出 KeyboardInterrupt # 使用者中斷執行 Exception # 常規錯誤的基類 StopIteration # 迭代器沒有更多的值 GeneratorExit # 生成器發生異常來通知退出 SystemExit # python直譯器請求退出 StandardError # 所有的內建標準異常的基類 ArithmeticError # 所有數值計算錯誤的基類 FloatingPointError # 浮點計算錯誤 OverflowError # 數值運算超出最大限制 AssertionError # 斷言語句失敗 AttributeError # 物件沒有這個屬性 EOFError # 沒有內建輸入,到達EOF標記 EnvironmentError # 作業系統錯誤的基類 IOError # 輸入/輸出操作失敗 OSError # 作業系統錯誤 WindowsError # windows系統呼叫失敗 ImportError # 匯入模組/物件失敗 KeyboardInterrupt # 使用者中斷執行(通常是ctrl+c) LookupError # 無效資料查詢的基類 IndexError # 序列中沒有此索引(index) KeyError # 對映中沒有這個鍵 MemoryError # 記憶體溢位錯誤(對於python直譯器不是致命的) NameError # 未宣告/初始化物件(沒有屬性) UnboundLocalError # 訪問未初始化的本地變數 ReferenceError # 若引用試圖訪問已經垃圾回收了的物件 RuntimeError # 一般的執行時錯誤 NotImplementedError # 尚未實現的方法 SyntaxError # python語法錯誤 IndentationError # 縮排錯誤 TabError # tab和空格混用 SystemError # 一般的直譯器系統錯誤 TypeError # 對型別無效的操作 ValueError # 傳入無效的引數 UnicodeError # Unicode相關的錯誤 UnicodeDecodeError # Unicode解碼時的錯誤 UnicodeEncodeError # Unicode編碼時的錯誤 UnicodeTranslateError # Unicode轉換時錯誤 Warning # 警告的基類 DeprecationWarning # 關於被棄用的特徵的警告 FutureWarning # 關於構造將來語義會有改變的警告 OverflowWarning # 舊的關於自動提升為長整形的警告 PendingDeprecationWarning # 關於特性將會被廢棄的警告 RuntimeWarning # 可疑的執行時行為的警告 SyntaxWarning # 可疑的語法的警告 UserWarning # 使用者程式碼生成的警告 class MyException(Exception): # 繼承Exception異常的類,定義自己的異常 pass try: # 監控這裡的異常 option=int(raw_input('my age:')) if option != 28: raise MyException,'a1' #觸發異常 except MyException,a: # 異常處理程式碼 print 'MyExceptionaa' print a # 列印異常處內容 except: # 捕捉所有其它錯誤 print 'except' finally: # 無論什麼情況都會執行 關閉檔案或斷開連線等 print 'finally' else: # 無任何異常 無法和finally同用 print 'no Exception' 函數語言程式設計的內建函式 apply(func[,nkw][,kw]) # 用可選的引數來呼叫func,nkw為非關鍵字引數,kw為關鍵字引數;返回值是函式呼叫的返回值 filter(func,seq) # 呼叫一個布林函式func來迭代遍歷每個seq中的元素;返回一個使func返回值為true的元素的序列 map(func,seq1[,seq2]) # 將函式func作用於給定序列(s)的每個元素,並用一個列表來提供返回值;如果func為None,func表現為一個身份函式,返回一個含有每個序列中元素集合的n個元組的列表 reduce(func,seq[,init]) # 將二元函式作用於seq序列的元素,每次攜帶一堆(先前的結果以及下一個序列元素),連續地將現有的結果和下一個值作用在獲得的隨後的結果上,最後減少我們的序列為一個單一的返回值;如果初始值init給定,第一個比較會是init和第一個序列元素而不是序列的頭兩個元素 re正則 compile(pattern,flags=0) # 對正規表示式模式pattern進行編譯,flags是可選識別符號,並返回一個regex物件 match(pattern,string,flags=0) # 嘗試用正規表示式模式pattern匹配字串string,flags是可選識別符號,如果匹配成功,則返回一個匹配物件;否則返回None search(pattern,string,flags=0) # 在字串string中搜尋正規表示式模式pattern的第一次出現,flags是可選識別符號,如果匹配成功,則返回一個匹配物件;否則返回None findall(pattern,string[,flags]) # 在字串string中搜尋正規表示式模式pattern的所有(非重複)出現:返回一個匹配物件的列表 # pattern=u'\u4e2d\u6587' 代表UNICODE finditer(pattern,string[,flags]) # 和findall()相同,但返回的不是列表而是迭代器;對於每個匹配,該迭代器返回一個匹配物件 split(pattern,string,max=0) # 根據正規表示式pattern中的分隔符把字元string分割為一個列表,返回成功匹配的列表,最多分割max次(預設所有) sub(pattern,repl,string,max=0) # 把字串string中所有匹配正規表示式pattern的地方替換成字串repl,如果max的值沒有給出,則對所有匹配的地方進行替換(subn()會返回一個表示替換次數的數值) group(num=0) # 返回全部匹配物件(或指定編號是num的子組) groups() # 返回一個包含全部匹配的子組的元組(如果沒匹配成功,返回一個空元組) 例子 re.findall(r'a[be]c','123abc456eaec789') # 返回匹配物件列表 ['abc', 'aec'] re.match("^(1|2) *(.*) *abc$", str).group(2) # 取第二個標籤 re.match("^(1|2) *(.*) *abc$", str).groups() # 取所有標籤 re.sub('[abc]','A','alex') # 替換 for i in re.finditer(r'\d+',s): # 迭代 print i.group(),i.span() # 搜尋網頁中UNICODE格式的中文 QueryAdd='http://www.anti-spam.org.cn/Rbl/Query/Result' Ip='222.129.184.52' s = requests.post(url=QueryAdd, data={'IP':Ip}) re.findall(u'\u4e2d\u56fd', s.text, re.S) 多執行緒 thread start_new_thread(function,args kwargs=None) # 產生一個新的執行緒 allocate_lock() # 分配一個LockType型別的鎖物件 exit() # 讓執行緒退出 acquire(wait=None) # 嘗試獲取鎖物件 locked() # 如果獲取了鎖物件返回True release() # 釋放鎖 thread例子 #!/usr/bin/env python #thread_test.py #不支援守護程式 import thread from time import sleep,ctime loops = [4,2] def loop(nloop,nsec,lock): print 'start loop %s at:%s' % (nloop,ctime()) sleep(nsec) print 'loop %s done at: %s' % (nloop, ctime()) lock.release() # 分配已獲得的鎖,操作結束後釋放相應的鎖通知主執行緒 def main(): print 'starting at:',ctime() locks = [] nloops = range(len(loops)) for i in nloops: lock = thread.allocate_lock() # 建立一個鎖 lock.acquire() # 呼叫各個鎖的acquire()函式獲得鎖 locks.append(lock) # 把鎖放到鎖列表locks中 for i in nloops: thread.start_new_thread(loop,(i,loops[i],locks[i])) # 建立執行緒 for i in nloops: while locks[i].locked():pass # 等待全部解鎖才繼續執行 print 'all DONE at:',ctime() if __name__ == '__main__': main() threading Thread # 表示一個執行緒的執行的物件 start() # 開始執行緒的執行 run() # 定義執行緒的功能的函式(一般會被子類重寫) join(timeout=None) # 允許主執行緒等待執行緒結束,程式掛起,直到執行緒結束;如果給了timeout,則最多等待timeout秒. getName() # 返回執行緒的名字 setName(name) # 設定執行緒的名字 isAlive() # 布林標誌,表示這個執行緒是否還在執行中 isDaemon() # 返回執行緒的daemon標誌 setDaemon(daemonic) # 後臺執行緒,把執行緒的daemon標誌設定為daemonic(一定要在呼叫start()函式前呼叫) # 預設主執行緒在退出時會等待所有子執行緒的結束。如果希望主執行緒不等待子執行緒,而是在退出時自動結束所有的子執行緒,就需要設定子執行緒為後臺執行緒(daemon) Lock # 鎖原語物件 Rlock # 可重入鎖物件.使單執行緒可以在此獲得已獲得了的鎖(遞迴鎖定) Condition # 條件變數物件能讓一個執行緒停下來,等待其他執行緒滿足了某個條件.如狀態改變或值的改變 Event # 通用的條件變數.多個執行緒可以等待某個事件的發生,在事件發生後,所有的執行緒都會被啟用 Semaphore # 為等待鎖的執行緒提供一個類似等候室的結構 BoundedSemaphore # 與Semaphore類似,只是不允許超過初始值 Time # 與Thread相似,只是他要等待一段時間後才開始執行 activeCount() # 當前活動的執行緒物件的數量 currentThread() # 返回當前執行緒物件 enumerate() # 返回當前活動執行緒的列表 settrace(func) # 為所有執行緒設定一個跟蹤函式 setprofile(func) # 為所有執行緒設定一個profile函式 threading例子1 #!/usr/bin/env python #encoding:utf8 import threading from Queue import Queue from time import sleep,ctime class ThreadFunc(object): def __init__(self,func,args,name=''): self.name=name self.func=func # loop self.args=args # (i,iplist[i],queue) def __call__(self): apply(self.func,self.args) # 函式apply() 執行loop函式並傳遞元組引數 def loop(nloop,ip,queue): print 'start',nloop,'at:',ctime() queue.put(ip) sleep(2) print 'loop',nloop,'done at:',ctime() if __name__ == '__main__': threads = [] queue = Queue() iplist = ['192.168.1.2','192.168.1.3','192.168.1.4','192.168.1.5','192.168.1.6','192.168.1.7','192.168.1.8'] nloops = range(len(iplist)) for i in nloops: t = threading.Thread(target=ThreadFunc(loop,(i,iplist[i],queue),loop.__name__)) threads.append(t) for i in nloops: threads[i].start() for i in nloops: threads[i].join() for i in nloops: print queue.get() threading例子2 #!/usr/bin/env python #encoding:utf8 from Queue import Queue import random,time,threading class Producer(threading.Thread): def __init__(self, t_name, queue): threading.Thread.__init__(self, name=t_name) self.data=queue def run(self): for i in range(5): print "%s: %s is producing %d to the queue!\n" %(time.ctime(), self.getName(), i) self.data.put(i) self.data.put(i*i) time.sleep(2) print "%s: %s finished!" %(time.ctime(), self.getName()) class Consumer(threading.Thread): def __init__(self, t_name, queue): threading.Thread.__init__(self, name=t_name) self.data=queue def run(self): for i in range(10): val = self.data.get() print "%s: %s is consuming. %d in the queue is consumed!\n" %(time.ctime(), self.getName(), val) print "%s: %s finished!" %(time.ctime(), self.getName()) if __name__ == '__main__': queue = Queue() producer = Producer('Pro.', queue) consumer = Consumer('Con.', queue) producer.start() consumer.start() producer.join() consumer.join() 後臺執行緒 import threading import time,random class MyThread(threading.Thread): def run(self): wait_time=random.randrange(1,10) print "%s will wait %d seconds" % (self.name, wait_time) time.sleep(wait_time) print "%s finished!" % self.name if __name__=="__main__": for i in range(5): t = MyThread() t.setDaemon(True) # 設定為後臺執行緒,主執行緒完成時不等待子執行緒完成就結束 t.start() threading控制最大併發_查詢日誌中IP資訊 #!/usr/bin/env python #coding:utf-8 import urllib2 import json import threading import time ''' by:某大牛 QQ:185635687 這個是多執行緒併發控制. 如果要改成多程式,只需把threading 換成 mulitprocessing.Process , 對, 就是換個名字而已. ''' #獲取ip 及其出現次數 def ip_dic(file_obj, dic): for i in file_obj: if i: ip=i.split('-')[0].strip() if ip in dic.keys(): dic[ip]=dic[ip] + 1 else: dic[ip]=1 return dic.iteritems() #目標函式 def get_data(url, ipcounts): data=urllib2.urlopen(url).read() datadict=json.loads(data) fdata = u"ip:%s---%s,%s,%s,%s,%s" %(datadict["data"]["ip"],ipcounts,datadict["data"]["country"],datadict["data"]["region"],datadict["data"]["city"],datadict["data"]["isp"]) print fdata #多執行緒 def threads(iters): thread_pool = [] for k in iters: url = "http://ip.taobao.com/service/getIpInfo.php?ip=" ipcounts = k[1] url = (url + k[0]).strip() t = threading.Thread(target=get_data, args=(url, ipcounts)) thread_pool.append(t) return thread_pool #控制多執行緒 def startt(t_list, max,second): l = len(t_list) n = max while l > 0: if l > max: nl = t_list[:max] t_list = t_list[max:] for t in nl: t.start() time.sleep(second) for t in nl: t.join() print '*'*15, str(n)+ ' ip has been queried'+'*'*15 n += max l = len(t_list) continue elif l <= max: nl = t_list for t in nl: t.start() for t in nl: t.join() print '>>> Totally ' + str(n+l ) + ' ip has been queried' l = 0 if __name__ =="__main__": dic={} with open('access.log') as file_obj: it = ip_dic(file_obj, dic) t_list= threads(it) startt(t_list, 15, 1) Queue通用佇列 q=Queue(size) # 建立大小size的Queue物件 qsize() # 返回佇列的大小(返回時候,可能被其他程式修改,近似值) empty() # 如果佇列為空返回True,否則Fales full() # 如果佇列已滿返回True,否則Fales put(item,block0) # 把item放到佇列中,如果給了block(不為0),函式會一直阻塞到佇列中有空間為止 get(block=0) # 從佇列中取一個物件,如果給了block(不為0),函式會一直阻塞到佇列中有物件為止 get_nowait # 預設get阻塞,這個不阻塞 multiprocessing 多程式併發 #!/usr/bin/env python #encoding:utf8 from multiprocessing import Process import time,os def f(name): time.sleep(1) print 'hello ',name print os.getppid() # 取得父程式ID print os.getpid() # 取得程式ID process_list = [] for i in range(10): p = Process(target=f,args=(i,)) p.start() process_list.append(p) for j in process_list: j.join() Queue程式間通訊 from multiprocessing import Process,Queue import time def f(name): time.sleep(1) q.put(['hello'+str(name)]) process_list = [] q = Queue() if __name__ == '__main__': for i in range(10): p = Process(target=f,args=(i,)) p.start() process_list.append(p) for j in process_list: j.join() for i in range(10): print q.get() Pipe管道 from multiprocessing import Process,Pipe import time import os def f(conn,name): time.sleep(1) conn.send(['hello'+str(name)]) print os.getppid(),'-----------',os.getpid() process_list = [] parent_conn,child_conn = Pipe() if __name__ == '__main__': for i in range(10): p = Process(target=f,args=(child_conn,i)) p.start() process_list.append(p) for j in process_list: j.join() for p in range(10): print parent_conn.recv() 程式間同步 #加鎖,使某一時刻只有一個程式 print from multiprocessing import Process,Lock import time import os def f(name): lock.acquire() time.sleep(1) print 'hello--'+str(name) print os.getppid(),'-----------',os.getpid() lock.release() process_list = [] lock = Lock() if __name__ == '__main__': for i in range(10): p = Process(target=f,args=(i,)) p.start() process_list.append(p) for j in process_list: j.join() 共享記憶體 # 通過使用Value或者Array把資料儲存在一個共享的記憶體表中 # 'd'和'i'引數是num和arr用來設定型別,d表示一個雙精浮點型別,i表示一個帶符號的整型。 from multiprocessing import Process,Value,Array import time import os def f(n,a,name): time.sleep(1) n.value = name * name for i in range(len(a)): a[i] = -i process_list = [] if __name__ == '__main__': num = Value('d',0.0) arr = Array('i',range(10)) for i in range(10): p = Process(target=f,args=(num,arr,i)) p.start() process_list.append(p) for j in process_list: j.join() print num.value print arr[:] manager # 比共享記憶體靈活,但緩慢 # 支援list,dict,Namespace,Lock,Semaphore,BoundedSemaphore,Condition,Event,Queue,Value,Array from multiprocessing import Process,Manager import time import os def f(d,name): time.sleep(1) d[name] = name * name print d process_list = [] if __name__ == '__main__': manager = Manager() d = manager.dict() for i in range(10): p = Process(target=f,args=(d,i)) p.start() process_list.append(p) for j in process_list: j.join() print d 最大併發數 import multiprocessing import time,os result = [] def run(h): print 'threading:' ,h,os.getpid() p = multiprocessing.Pool(processes=20) for i in range(100): result.append(p.apply_async(run,(i,))) p.close() for res in result: res.get(timeout=5) socket通訊 from socket import * # 避免 socket.socket() s.bind() # 繫結地址到套接字 s.listen() # 開始TCP監聽 s.accept() # 被動接受TCP客戶端連線,等待連線的到來 s.connect() # 主動初始化TCP伺服器連線 s.connect_ex() # connect()函式的擴充套件版本,出錯時返回出錯碼,而不是跑出異常 s.recv() # 接收TCP資料 s.send() # 傳送TCP資料 s.sendall() # 完整傳送TCP資料 s.recvfrom() # 接收UDP資料 s.sendto() # 傳送UDP資料 s.getpeername() # 連線到當前套接字的遠端的地址(TCP連線) s.getsockname() # 當前套接字的地址 s.getsockopt() # 返回指定套接字的引數 s.setsockopt() # 設定指定套接字的引數 s.close() # 關閉套接字 s.setblocking() # 設定套接字的阻塞與非阻塞模式 s.settimeout() # 設定阻塞套接字操作的超時時間 s.gettimeout() # 得到阻塞套接字操作的超時時間 s.filen0() # 套接字的檔案描述符 s.makefile() # 建立一個與該套接字關聯的檔案物件 socket.AF_UNIX # 只能夠用於單一的Unix系統程式間通訊 socket.AF_INET # 伺服器之間網路通訊 socket.AF_INET6 # IPv6 socket.SOCK_STREAM # 流式socket , for TCP socket.SOCK_DGRAM # 資料包式socket , for UDP socket.SOCK_RAW # 原始套接字,普通的套接字無法處理ICMP、IGMP等網路報文,而SOCK_RAW可以;其次,SOCK_RAW也可以處理特殊的IPv4報文;此外,利用原始套接字,可以通過IP_HDRINCL套接字選項由使用者構造IP頭。 socket.SOCK_RDM # 是一種可靠的UDP形式,即保證交付資料包但不保證順序。SOCK_RAM用來提供對原始協議的低階訪問,在需要執行某些特殊操作時使用,如傳送ICMP報文。SOCK_RAM通常僅限於高階使用者或管理員執行的程式使用。 socket.SOCK_SEQPACKET # 可靠的連續資料包服務 SocketServer #!/usr/bin/python #server.py import SocketServer import os class MyTCP(SocketServer.BaseRequestHandler): def handle(self): while True: self.data=self.request.recv(1024).strip() if self.data == 'quit' or not self.data:break cmd=os.popen(self.data).read() if cmd == '':cmd= self.data + ': Command not found' self.request.sendall(cmd) if __name__ == '__main__': HOST,PORT = '10.0.0.119',50007 server = SocketServer.ThreadingTCPServer((HOST,PORT),MyTCP) server.serve_forever() SocketClient #!/usr/bin/python #client.py import socket HOST='10.0.0.119' PORT=50007 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect((HOST,PORT)) while True: while True: cmd=raw_input('CMD:').strip() if cmd != '':break s.sendall(cmd) data=s.recv(1024).split('\n') print 'cmd:' for line in data:print line s.close() ftp ftpserver #!/usr/bin/python #ftpserver.py import SocketServer import os import cPickle import md5 from time import sleep def filer(file1): try: f = file(file1,'rb') return cPickle.load(f) except IOError: return {} except EOFError: return {} f.close() def filew(file1,content): f = file(file1,'wb') cPickle.dump(content,f) f.close() class MyTCP(SocketServer.BaseRequestHandler): def handle(self): i = 0 while i<3: user=self.request.recv(1024).strip() userinfo=filer('user.pkl') if userinfo.has_key(user.split()[0]): if md5.new(user.split()[1]).hexdigest() == userinfo[user.split()[0]]: results='login successful' self.request.sendall(results) login='successful' break else: i = i + 1 results='Error:password not correct' self.request.sendall(results) continue else: i = i + 1 results='Error:password not correct' self.request.sendall(results) continue break else: results = 'Error:Wrong password too many times' self.request.sendall(results) login='failure' home_path = os.popen('pwd').read().strip() + '/' + user.split()[0] current_path = '/' print home_path while True: if login == 'failure': break print 'home_path:%s=current_path:%s' %(home_path,current_path) cmd=self.request.recv(1024).strip() print cmd if cmd == 'quit': break elif cmd == 'dir': list=os.listdir('%s%s' %(home_path,current_path)) if list: dirlist,filelist = '','' for i in list: if os.path.isdir('%s%s%s' %(home_path,current_path,i)): dirlist = dirlist + '\033[32m' + i + '\033[m\t' else: filelist = filelist + i + '\t' results = dirlist + filelist else: results = '\033[31mnot find\033[m' self.request.sendall(results) elif cmd == 'pdir': self.request.sendall(current_path) elif cmd.split()[0] == 'mdir': if cmd.split()[1].isalnum(): tmppath='%s%s%s' %(home_path,current_path,cmd.split()[1]) os.makedirs(tmppath) self.request.sendall('\033[32mcreating successful\033[m') else: self.request.sendall('\033[31mcreate failure\033[m') elif cmd.split()[0] == 'cdir': if cmd.split()[1] == '/': tmppath='%s%s' %(home_path,cmd.split()[1]) if os.path.isdir(tmppath): current_path = cmd.split()[1] self.request.sendall(current_path) else: self.request.sendall('\033[31mnot_directory\033[m') elif cmd.split()[1].startswith('/'): tmppath='%s%s' %(home_path,cmd.split()[1]) if os.path.isdir(tmppath): current_path = cmd.split()[1] + '/' self.request.sendall(current_path) else: self.request.sendall('\033[31mnot_directory\033[m') else: tmppath='%s%s%s' %(home_path,current_path,cmd.split()[1]) if os.path.isdir(tmppath): current_path = current_path + cmd.split()[1] + '/' self.request.sendall(current_path) else: self.request.sendall('\033[31mnot_directory\033[m') elif cmd.split()[0] == 'get': if os.path.isfile('%s%s%s' %(home_path,current_path,cmd.split()[1])): f = file('%s%s%s' %(home_path,current_path,cmd.split()[1]),'rb') self.request.sendall('ready_file') sleep(0.5) self.request.send(f.read()) f.close() sleep(0.5) elif os.path.isdir('%s%s%s' %(home_path,current_path,cmd.split()[1])): self.request.sendall('ready_dir') sleep(0.5) for dirpath in os.walk('%s%s%s' %(home_path,current_path,cmd.split()[1])): dir=dirpath[0].replace('%s%s' %(home_path,current_path),'',1) self.request.sendall(dir) sleep(0.5) for filename in dirpath[2]: self.request.sendall(filename) sleep(0.5) f = file('%s/%s' %(dirpath[0],filename),'rb') self.request.send(f.read()) f.close() sleep(0.5) self.request.sendall('file_get_done') sleep(0.5) else: self.request.sendall('dir_get_done') sleep(0.5) else: self.request.sendall('get_failure') continue self.request.sendall('get_done') elif cmd.split()[0] == 'send': if os.path.exists('%s%s%s' %(home_path,current_path,cmd.split()[1])): self.request.sendall('existing') action=self.request.recv(1024) if action == 'cancel': continue self.request.sendall('ready') msg=self.request.recv(1024) if msg == 'ready_file': f = file('%s%s%s' %(home_path,current_path,cmd.split()[1]),'wb') while True: data=self.request.recv(1024) if data == 'file_send_done':break f.write(data) f.close() elif msg == 'ready_dir': os.system('mkdir -p %s%s%s' %(home_path,current_path,cmd.split()[1])) while True: dir=self.request.recv(1024) if dir == 'get_done':break os.system('mkdir -p %s%s%s' %(home_path,current_path,dir)) while True: filename=self.request.recv(1024) if filename == 'dir_send_done':break f = file('%s%s%s/%s' %(home_path,current_path,dir,filename),'wb') while True: data=self.request.recv(1024) if data == 'file_send_done':break f.write(data) f.close() self.request.sendall('%s/%s\t\033[32mfile_done\033[m' %(dir,filename)) self.request.sendall('%s\t\033[32mdir_done\033[m' %(dir)) elif msg == 'unknown_file': continue else: results = cmd.split()[0] + ': Command not found' self.request.sendall(results) if __name__ == '__main__': HOST,PORT = '10.152.14.85',50007 server = SocketServer.ThreadingTCPServer((HOST,PORT),MyTCP) server.serve_forever() ftpmanage #!/usr/bin/python #manage_ftp.py import cPickle import sys import md5 import os import getpass def filer(file1): try: f = file(file1,'rb') return cPickle.load(f) except IOError: return {} except EOFError: return {} f.close() def filew(file1,content): f = file(file1,'wb') cPickle.dump(content,f) f.close() while True: print ''' 1.add user 2.del user 3.change password 4.query user 0.exit ''' i = raw_input(':').strip() userinfo=filer('user.pkl') if i == '': continue elif i == '1': while True: user=raw_input('user name:').strip() if user.isalnum(): i = 0 while i<3: passwd=getpass.getpass('passwd:').strip() if passwd == '': continue else: passwd1=getpass.getpass('Confirm password:').strip() if passwd == passwd1: mpasswd = md5.new(passwd).hexdigest() userinfo[user] = mpasswd os.system('mkdir -p %s' %user) print '%s creating successful ' %user break else: print "Passwords don't match " i = i + 1 continue else: print 'Too many wrong' continue break else: print 'user not legal' continue elif i == '2': user=raw_input('user name:').strip() if userinfo.has_key(user): del userinfo[user] print 'Delete users successfully' else: print 'user not exist' continue elif i == '3': user=raw_input('user name:').strip() if userinfo.has_key(user): i = 0 while i<3: passwd=getpass.getpass('passwd:').strip() if passwd == '': continue else: passwd1=getpass.getpass('Confirm password:').strip() if passwd == passwd1: mpasswd = md5.new(passwd).hexdigest() userinfo[user] = mpasswd print '%s password is changed' %user break else: print "Passwords don't match " i = i + 1 continue else: print 'Too many wrong' continue else: print 'user not exist' continue elif i == '4': print userinfo.keys() elif i == '0': sys.exit() else: print 'select error' continue filew('user.pkl',content=userinfo) ftpclient #!/usr/bin/python #ftpclient.py import socket import os import getpass from time import sleep HOST='10.152.14.85' PORT=50007 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect((HOST,PORT)) while True: user = raw_input('user:').strip() if user.isalnum(): while True: passwd = getpass.getpass('passwd:').strip() s.sendall(user + ' ' + passwd) servercmd=s.recv(1024) if servercmd == 'login successful': print '\033[32m%s\033[m' %servercmd break else: print servercmd while True: cmd=raw_input('FTP>').strip() if cmd == '': continue if cmd.split()[0] == 'get': if cmd == 'get':continue for i in cmd.split()[1:]: if os.path.exists(i): confirm = raw_input("\033[31mPlease confirm whether the cover %s(Y/N):\033[m" %(i)).upper().startswith('Y') if not confirm: print '%s cancel' %i continue s.sendall('get ' + i) servercmd=s.recv(1024) if servercmd == 'inexistence': print '%s \t\033[32minexistence\033[m' %i continue elif servercmd == 'ready_file': f = file(i,'wb') while True: data=s.recv(1024) if data == 'get_done':break f.write(data) f.close() print '%s \t\033[32mfile_done\033[m' %(i) elif servercmd == 'ready_dir': try: os.makedirs(i) except: pass while True: serverdir=s.recv(1024) if serverdir == 'get_done':break os.system('mkdir -p %s' %serverdir) print '%s \t\033[32mdir_done\033[m' %(serverdir) while True: serverfile=s.recv(1024) if serverfile == 'dir_get_done':break f = file('%s/%s' %(serverdir,serverfile),'wb') while True: data=s.recv(1024) if data == 'file_get_done':break f.write(data) f.close() print '%s/%s \t\033[32mfile_done\033[m' %(serverdir,serverfile) elif cmd.split()[0] == 'send': if cmd == 'send':continue for i in cmd.split()[1:]: if not os.path.exists(i): print '%s\t\033[31minexistence\033[m' %i continue s.sendall('send ' + i) servercmd=s.recv(1024) if servercmd == 'existing': confirm = raw_input("\033[31mPlease confirm whether the cover %s(Y/N):\033[m" %(i)).upper().startswith('Y') if confirm: s.sendall('cover') servercmd=s.recv(1024) else: s.sendall('cancel') print '%s\tcancel' %i continue if os.path.isfile(i): s.sendall('ready_file') sleep(0.5) f = file(i,'rb') s.send(f.read()) sleep(0.5) s.sendall('file_send_done') print '%s\t\033[32mfile done\033[m' %(cmd.split()[1]) f.close() elif os.path.isdir(i): s.sendall('ready_dir') sleep(0.5) for dirpath in os.walk(i): dir=dirpath[0].replace('%s/' %os.popen('pwd').read().strip(),'',1) s.sendall(dir) sleep(0.5) for filename in dirpath[2]: s.sendall(filename) sleep(0.5) f = file('%s/%s' %(dirpath[0],filename),'rb') s.send(f.read()) f.close() sleep(0.5) s.sendall('file_send_done') msg=s.recv(1024) print msg else: s.sendall('dir_send_done') msg=s.recv(1024) print msg else: s.sendall('unknown_file') print '%s\t\033[31munknown type\033[m' %i continue sleep(0.5) s.sendall('get_done') elif cmd.split()[0] == 'cdir': if cmd == 'cdir':continue s.sendall(cmd) data=s.recv(1024) print data continue elif cmd == 'ls': list=os.popen(cmd).read().strip().split('\n') if list: dirlist,filelist = '','' for i in list: if os.path.isdir(i): dirlist = dirlist + '\033[32m' + i + '\033[m\t' else: filelist = filelist + i + '\t' results = dirlist + filelist else: results = '\033[31mnot find\033[m' print results continue elif cmd == 'pwd': os.system(cmd) elif cmd.split()[0] == 'cd': try: os.chdir(cmd.split()[1]) except: print '\033[31mcd failure\033[m' elif cmd == 'dir': s.sendall(cmd) data=s.recv(1024) print data continue elif cmd == 'pdir': s.sendall(cmd) data=s.recv(1024) print data continue elif cmd.split()[0] == 'mdir': if cmd == 'mdir':continue s.sendall(cmd) data=s.recv(1024) print data continue elif cmd.split()[0] == 'help': print ''' get [file] [dir] send [file] [dir] dir mdir cdir pdir pwd md cd ls help quit ''' continue elif cmd == 'quit': break else: print '\033[31m%s: Command not found,Please see the "help"\033[m' %cmd else: continue break s.close() 掃描主機開放埠 #!/usr/bin/env python import socket def check_server(address,port): s=socket.socket() try: s.connect((address,port)) return True except socket.error,e: return False if __name__=='__main__': from optparse import OptionParser parser=OptionParser() parser.add_option("-a","--address",dest="address",default='localhost',help="Address for server",metavar="ADDRESS") parser.add_option("-s","--start",dest="start_port",type="int",default=1,help="start port",metavar="SPORT") parser.add_option("-e","--end",dest="end_port",type="int",default=1,help="end port",metavar="EPORT") (options,args)=parser.parse_args() print 'options: %s, args: %s' % (options, args) port=options.start_port while(port<=options.end_port): check = check_server(options.address, port) if (check): print 'Port %s is on' % port port=port+1 mysql #apt-get install mysql-server #apt-get install python-MySQLdb help(MySQLdb.connections.Connection) # 檢視連結引數 conn=MySQLdb.connect(host='localhost',user='root',passwd='123456',db='fortress',port=3306) # 定義連線 #conn=MySQLdb.connect(unix_socket='/var/run/mysqld/mysqld.sock',user='root',passwd='123456') # 使用socket檔案連結 cur=conn.cursor() # 定義遊標 conn.select_db('fortress') # 選擇資料庫 sqlcmd = 'insert into user(name,age) value(%s,%s)' # 定義sql命令 cur.executemany(sqlcmd,[('aa',1),('bb',2),('cc',3)]) # 插入多條值 cur.execute('delete from user where id=20') # 刪除一條記錄 cur.execute("update user set name='a' where id=20") # 更細資料 sqlresult = cur.fetchall() # 接收全部返回結果 conn.commit() # 提交 cur.close() # 關閉遊標 conn.close() # 關閉連線 import MySQLdb def mydb(dbcmdlist): try: conn=MySQLdb.connect(host='localhost',user='root',passwd='123456',db='fortress',port=3306) cur=conn.cursor() cur.execute('create database if not exists fortress;') # 建立資料庫 conn.select_db('fortress') # 選擇資料庫 cur.execute('drop table if exists log;') # 刪除表 cur.execute('CREATE TABLE log ( id BIGINT(20) NOT NULL AUTO_INCREMENT, loginuser VARCHAR(50) DEFAULT NULL, remoteip VARCHAR(50) DEFAULT NULL, PRIMARY KEY (id) );') # 建立表 result=[] for dbcmd in dbcmdlist: cur.execute(dbcmd) # 執行sql sqlresult = cur.fetchall() # 接收全部返回結果 result.append(sqlresult) conn.commit() # 提交 cur.close() conn.close() return result except MySQLdb.Error,e: print 'mysql error msg: ',e sqlcmd=[] sqlcmd.append("insert into log (loginuser,remoteip)values('%s','%s');" %(loginuser,remoteip)) mydb(sqlcmd) sqlcmd=[] sqlcmd.append("select * from log;") result = mydb(sqlcmd) for i in result[0]: print i paramiko 安裝 sudo apt-get install python-setuptools easy_install sudo apt-get install python-all-dev sudo apt-get install build-essential paramiko例項(賬號密碼登入執行命令) #!/usr/bin/python #ssh import paramiko import sys,os host = '10.152.15.200' user = 'peterli' password = '123456' s = paramiko.SSHClient() # 繫結例項 s.load_system_host_keys() # 載入本地HOST主機檔案 s.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 允許連線不在know_hosts檔案中的主機 s.connect(host,22,user,password,timeout=5) # 連線遠端主機 while True: cmd=raw_input('cmd:') stdin,stdout,stderr = s.exec_command(cmd) # 執行命令 cmd_result = stdout.read(),stderr.read() # 讀取命令結果 for line in cmd_result: print line, s.close() paramiko例項(傳送檔案) #!/usr/bin/evn python import os import paramiko host='127.0.0.1' port=22 username = 'peterli' password = '123456' ssh=paramiko.Transport((host,port)) privatekeyfile = os.path.expanduser('~/.ssh/id_rsa') mykey = paramiko.RSAKey.from_private_key_file( os.path.expanduser('~/.ssh/id_rsa')) # 載入key 不使用key可不加 ssh.connect(username=username,password=password) # 連線遠端主機 # 使用key把 password=password 換成 pkey=mykey sftp=paramiko.SFTPClient.from_transport(ssh) # SFTP使用Transport通道 sftp.get('/etc/passwd','pwd1') # 下載 兩端都要指定檔名 sftp.put('pwd','/tmp/pwd') # 上傳 sftp.close() ssh.close() paramiko例項(金鑰執行命令) #!/usr/bin/python #ssh import paramiko import sys,os host = '10.152.15.123' user = 'peterli' s = paramiko.SSHClient() s.load_system_host_keys() s.set_missing_host_key_policy(paramiko.AutoAddPolicy()) privatekeyfile = os.path.expanduser('~/.ssh/id_rsa') # 定義key路徑 mykey = paramiko.RSAKey.from_private_key_file(privatekeyfile) # mykey=paramiko.DSSKey.from_private_key_file(privatekeyfile,password='061128') # DSSKey方式 password是key的密碼 s.connect(host,22,user,pkey=mykey,timeout=5) cmd=raw_input('cmd:') stdin,stdout,stderr = s.exec_command(cmd) cmd_result = stdout.read(),stderr.read() for line in cmd_result: print line, s.close() ssh併發(Pool控制最大併發) #!/usr/bin/env python #encoding:utf8 #ssh_concurrent.py import multiprocessing import sys,os,time import paramiko def ssh_cmd(host,port,user,passwd,cmd): msg = "-----------Result:%s----------" % host s = paramiko.SSHClient() s.load_system_host_keys() s.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: s.connect(host,22,user,passwd,timeout=5) stdin,stdout,stderr = s.exec_command(cmd) cmd_result = stdout.read(),stderr.read() print msg for line in cmd_result: print line, s.close() except paramiko.AuthenticationException: print msg print 'AuthenticationException Failed' except paramiko.BadHostKeyException: print msg print "Bad host key" result = [] p = multiprocessing.Pool(processes=20) cmd=raw_input('CMD:') f=open('serverlist.conf') list = f.readlines() f.close() for IP in list: print IP host=IP.split()[0] port=int(IP.split()[1]) user=IP.split()[2] passwd=IP.split()[3] result.append(p.apply_async(ssh_cmd,(host,port,user,passwd,cmd))) p.close() for res in result: res.get(timeout=35) ssh併發(取檔案狀態併傳送郵件) #!/usr/bin/python #encoding:utf8 #config file: ip.list import paramiko import multiprocessing import smtplib import sys,os,time,datetime,socket,re from email.mime.text import MIMEText # 配置檔案(IP列表) Conf = 'ip.list' user_name = 'peterli' user_pwd = 'passwd' port = 22 PATH = '/home/peterli/' # 設定伺服器名稱、使用者名稱、密碼以及郵件字尾 mail_host = "smtp.163.com" mail_user = "xuesong" mail_pass = "mailpasswd" mail_postfix = "163.com" mailto_list = ["272121935@qq.com","quanzhou722@163.com"] title = 'file check' DATE1=(datetime.datetime.now() + datetime.timedelta(days=-1) ).strftime('%Y%m%d') file_path = '%s%s' %(PATH,DATE1) def Ssh_Cmd(file_path,host_ip,user_name,user_pwd,port=22): s = paramiko.SSHClient() s.load_system_host_keys() s.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: s.connect(hostname=host_ip,port=port,username=user_name,password=user_pwd) stdin,stdout,stderr = s.exec_command('stat %s' %file_path) stat_result = '%s%s' %(stdout.read(),stderr.read()) if stat_result.find('No such file or directory') == -1: file_status = 'OK\t' stdin,stdout,stderr = s.exec_command('du -sh %s' %file_path) cmd1_result = '%s_%s' %(stat_result.split()[32],stat_result.split()[33].split('.')[0]) cmd2_result = ('%s%s' %(stdout.read(),stderr.read())).split()[0] else: file_status = '未生成\t' cmd1_result = 'null' cmd2_result = 'null' q.put(['Login successful']) s.close() except socket.error: file_status = '主機或埠錯誤' cmd1_result = '-' cmd2_result = '-' except paramiko.AuthenticationException: file_status = '使用者或密碼錯誤' cmd1_result = '-' cmd2_result = '-' except paramiko.BadHostKeyException: file_status = 'Bad host key' cmd1_result = '-' cmd2_result = '-' except: file_status = 'ssh異常' cmd1_result = '-' cmd2_result = '-' r.put('%s\t-\t%s\t%s\t%s\t%s\n' %(time.strftime('%Y-%m-%d_%H:%M'),host_ip,file_status,cmd2_result,cmd1_result)) def Concurrent(Conf,file_path,user_name,user_pwd,port): # 執行總計 total = 0 # 讀取配置檔案 f=open(Conf) list = f.readlines() f.close() # 併發執行 process_list = [] log_file = file('file_check.log', 'w') log_file.write('檢查時間\t\t業務\tIP\t\t檔案狀態\t大小\t生成時間\n') for host_info in list: # 判斷配置檔案中註釋行跳過 if host_info.startswith('#'): continue # 取變數,其中任意變數未取到就跳過執行 try: host_ip=host_info.split()[0].strip() #user_name=host_info.split()[1] #user_pwd=host_info.split()[2] except: log_file.write('Profile error: %s\n' %(host_info)) continue #try: # port=int(host_info.split()[3]) #except: # port=22 total +=1 p = multiprocessing.Process(target=Ssh_Cmd,args=(file_path,host_ip,user_name,user_pwd,port)) p.start() process_list.append(p) for j in process_list: j.join() for j in process_list: log_file.write(r.get()) successful = q.qsize() log_file.write('執行完畢。 總執行:%s 登入成功:%s 登入失敗:%s\n' %(total,successful,total - successful)) log_file.flush() log_file.close() def send_mail(to_list, sub): me = mail_user + "<"+mail_user+"@"+mail_postfix+">" fp = open('file_check.log') msg = MIMEText(fp.read(),_charset="utf-8") fp.close() msg['Subject'] = sub msg['From'] = me msg['To'] = ";".join(to_list) try: send_smtp = smtplib.SMTP() send_smtp.connect(mail_host) send_smtp.login(mail_user, mail_pass) send_smtp.sendmail(me, to_list, msg.as_string()) send_smtp.close() return True except Exception, e: print str(e)[1] return False if __name__ == '__main__': q = multiprocessing.Queue() r = multiprocessing.Queue() Concurrent(Conf,file_path,user_name,user_pwd,port) if send_mail(mailto_list,title): print "傳送成功" else: print "傳送失敗" LazyManage併發批量操作(判斷非root互動到root操作) #!/usr/bin/python #encoding:utf8 # LzayManage.py # config file: serverlist.conf import paramiko import multiprocessing import sys,os,time,socket,re def Ssh_Cmd(host_ip,Cmd,user_name,user_pwd,port=22): s = paramiko.SSHClient() s.load_system_host_keys() s.set_missing_host_key_policy(paramiko.AutoAddPolicy()) s.connect(hostname=host_ip,port=port,username=user_name,password=user_pwd) stdin,stdout,stderr = s.exec_command(Cmd) Result = '%s%s' %(stdout.read(),stderr.read()) q.put('successful') s.close() return Result.strip() def Ssh_Su_Cmd(host_ip,Cmd,user_name,user_pwd,root_name,root_pwd,port=22): s = paramiko.SSHClient() s.load_system_host_keys() s.set_missing_host_key_policy(paramiko.AutoAddPolicy()) s.connect(hostname=host_ip,port=port,username=user_name,password=user_pwd) ssh = s.invoke_shell() time.sleep(0.1) ssh.send('su - %s\n' %(root_name)) buff = '' while not buff.endswith('Password: '): resp = ssh.recv(9999) buff +=resp ssh.send('%s\n' %(root_pwd)) buff = '' while True: resp = ssh.recv(9999) buff +=resp if ': incorrect password' in buff: su_correct='passwd_error' break elif buff.endswith('# '): su_correct='passwd_correct' break if su_correct == 'passwd_correct': ssh.send('%s\n' %(Cmd)) buff = '' while True: resp = ssh.recv(9999) if resp.endswith('# '): buff +=re.sub('\[.*@.*\]# $','',resp) break buff +=resp Result = buff.lstrip('%s' %(Cmd)) q.put('successful') elif su_correct == 'passwd_error': Result = "\033[31mroot密碼錯誤\033[m" s.close() return Result.strip() def Send_File(host_ip,PathList,user_name,user_pwd,Remote='/tmp',port=22): s=paramiko.Transport((host_ip,port)) s.connect(username=user_name,password=user_pwd) sftp=paramiko.SFTPClient.from_transport(s) for InputPath in PathList: LocalPath = re.sub('^\./','',InputPath.rstrip('/')) RemotePath = '%s/%s' %( Remote , os.path.basename( LocalPath )) try: sftp.rmdir(RemotePath) except: pass try: sftp.remove(RemotePath) except: pass if os.path.isdir(LocalPath): sftp.mkdir(RemotePath) for path,dirs,files in os.walk(LocalPath): for dir in dirs: dir_path = os.path.join(path,dir) sftp.mkdir('%s/%s' %(RemotePath,re.sub('^%s/' %LocalPath,'',dir_path))) for file in files: file_path = os.path.join(path,file) sftp.put( file_path,'%s/%s' %(RemotePath,re.sub('^%s/' %LocalPath,'',file_path))) else: sftp.put(LocalPath,RemotePath) q.put('successful') sftp.close() s.close() Result = '%s \033[32m傳送完成\033[m' % PathList return Result def Ssh(host_ip,Operation,user_name,user_pwd,root_name,root_pwd,Cmd=None,PathList=None,port=22): msg = "\033[32m-----------Result:%s----------\033[m" % host_ip try: if Operation == 'Ssh_Cmd': Result = Ssh_Cmd(host_ip=host_ip,Cmd=Cmd,user_name=user_name,user_pwd=user_pwd,port=port) elif Operation == 'Ssh_Su_Cmd': Result = Ssh_Su_Cmd(host_ip=host_ip,Cmd=Cmd,user_name=user_name,user_pwd=user_pwd,root_name=root_name,root_pwd=root_pwd,port=port) elif Operation == 'Ssh_Script': Send_File(host_ip=host_ip,PathList=PathList,user_name=user_name,user_pwd=user_pwd,port=port) Script_Head = open(PathList[0]).readline().strip() LocalPath = re.sub('^\./','',PathList[0].rstrip('/')) Cmd = '%s /tmp/%s' %( re.sub('^#!','',Script_Head), os.path.basename( LocalPath )) Result = Ssh_Cmd(host_ip=host_ip,Cmd=Cmd,user_name=user_name,user_pwd=user_pwd,port=port) elif Operation == 'Ssh_Su_Script': Send_File(host_ip=host_ip,PathList=PathList,user_name=user_name,user_pwd=user_pwd,port=port) Script_Head = open(PathList[0]).readline().strip() LocalPath = re.sub('^\./','',PathList[0].rstrip('/')) Cmd = '%s /tmp/%s' %( re.sub('^#!','',Script_Head), os.path.basename( LocalPath )) Result = Ssh_Su_Cmd(host_ip=host_ip,Cmd=Cmd,user_name=user_name,user_pwd=user_pwd,root_name=root_name,root_pwd=root_pwd,port=port) elif Operation == 'Send_File': Result = Send_File(host_ip=host_ip,PathList=PathList,user_name=user_name,user_pwd=user_pwd,port=port) else: Result = '操作不存在' except socket.error: Result = '\033[31m主機或埠錯誤\033[m' except paramiko.AuthenticationException: Result = '\033[31m使用者名稱或密碼錯誤\033[m' except paramiko.BadHostKeyException: Result = '\033[31mBad host key\033[m[' except IOError: Result = '\033[31m遠端主機已存在非空目錄或沒有寫許可權\033[m' except: Result = '\033[31m未知錯誤\033[m' r.put('%s\n%s\n' %(msg,Result)) def Concurrent(Conf,Operation,user_name,user_pwd,root_name,root_pwd,Cmd=None,PathList=None,port=22): # 讀取配置檔案 f=open(Conf) list = f.readlines() f.close() # 執行總計 total = 0 # 併發執行 for host_info in list: # 判斷配置檔案中註釋行跳過 if host_info.startswith('#'): continue # 取變數,其中任意變數未取到就跳過執行 try: host_ip=host_info.split()[0] #user_name=host_info.split()[1] #user_pwd=host_info.split()[2] except: print('Profile error: %s' %(host_info) ) continue try: port=int(host_info.split()[3]) except: port=22 total +=1 p = multiprocessing.Process(target=Ssh,args=(host_ip,Operation,user_name,user_pwd,root_name,root_pwd,Cmd,PathList,port)) p.start() # 列印執行結果 for j in range(total): print(r.get() ) if Operation == 'Ssh_Script' or Operation == 'Ssh_Su_Script': successful = q.qsize() / 2 else: successful = q.qsize() print('\033[32m執行完畢[總執行:%s 成功:%s 失敗:%s]\033[m' %(total,successful,total - successful) ) q.close() r.close() def Help(): print(''' 1.執行命令 2.執行指令碼 \033[32m[位置1指令碼(必須帶指令碼頭),後可帶執行指令碼所需要的包\檔案\資料夾路徑,空格分隔]\033[m 3.傳送檔案 \033[32m[傳送的包\檔案\資料夾路徑,空格分隔]\033[m 退出: 0\exit\quit 幫助: help\h\? 注意: 傳送檔案預設為/tmp下,如已存在同名檔案會被強制覆蓋,非空目錄則中斷操作.執行指令碼先將本地指令碼及包傳送遠端主機上,傳送規則同傳送檔案 ''') if __name__=='__main__': # 定義root賬號資訊 root_name = 'root' root_pwd = 'peterli' user_name='peterli' user_pwd='<++(3Ie' # 配置檔案 Conf='serverlist.conf' if not os.path.isfile(Conf): print('\033[33m配置檔案 %s 不存在\033[m' %(Conf) ) sys.exit() Help() while True: i = raw_input("\033[35m[請選擇操作]: \033[m").strip() q = multiprocessing.Queue() r = multiprocessing.Queue() if i == '1': if user_name == root_name: Operation = 'Ssh_Cmd' else: Operation = 'Ssh_Su_Cmd' Cmd = raw_input('CMD: ').strip() if len(Cmd) == 0: print('\033[33m命令為空\033[m') continue Concurrent(Conf=Conf,Operation=Operation,user_name=user_name,user_pwd=user_pwd,root_name=root_name,root_pwd=root_pwd,Cmd=Cmd) elif i == '2': if user_name == root_name: Operation = 'Ssh_Script' else: Operation = 'Ssh_Su_Script' PathList = raw_input('\033[36m本地指令碼路徑: \033[m').strip().split() if len(PathList) == 0: print('\033[33m路徑為空\033[m') continue if not os.path.isfile(PathList[0]): print('\033[33m本地路徑 %s 不存在或不是檔案\033[m' %(PathList[0]) ) continue for LocalPath in PathList[1:]: if not os.path.exists(LocalPath): print('\033[33m本地路徑 %s 不存在\033[m' %(LocalPath) ) break else: Concurrent(Conf=Conf,Operation=Operation,user_name=user_name,user_pwd=user_pwd,root_name=root_name,root_pwd=root_pwd,PathList=PathList) elif i == '3': Operation = 'Send_File' PathList = raw_input('\033[36m本地路徑: \033[m').strip().split() if len(PathList) == 0: print('\033[33m路徑為空\033[m') continue for LocalPath in PathList: if not os.path.exists(LocalPath): print('\033[33m本地路徑 %s 不存在\033[m' %(LocalPath) ) break else: Concurrent(Conf=Conf,Operation=Operation,user_name=user_name,user_pwd=user_pwd,root_name=root_name,root_pwd=root_pwd,PathList=PathList) elif i == '0' or i == 'exit' or i == 'quit': print("\033[34m退出LazyManage指令碼\033[m") sys.exit() elif i == 'help' or i == 'h' or i == '?': Help() web頁面操作 下載檔案 #!/usr/bin/env python #encoding:utf8 import urllib2 url = 'http://www.01happy.com/wp-content/uploads/2012/09/bg.png' file("./pic/%04d.png" % i, "wb").write(urllib2.urlopen(url).read()) 讀取網頁指定內容 #讀取整個網頁,正則擷取匹配資訊 #!/usr/bin/env python #encoding=utf-8 import re, urllib,datetime def getPageCode(url, fromCharset, toCharset): fr = urllib.urlopen(url) pageCode = fr.read() fr.close() return pageCode def getImgUrl(pageCode): pattern = re.compile(r'(\d*\-\d*\-\d* \d*:\d*:\d*)') return re.findall(pattern, pageCode) if __name__ == '__main__': f = file('url.conf') c = f.readlines() f.close() for url in c: pageCode = getPageCode(url.rstrip(), 'gb2312', 'utf8') imgUrl = getImgUrl(pageCode) print imgUrl 讀取網頁圖片大小 # 根據http頭,得到content-type的值 #!/usr/bin/env python #encoding=utf-8 import urllib2 url = 'http://www.01happy.com/wp-content/uploads/2012/09/bg.png' reqst = urllib2.Request(url) opener = urllib2.build_opener() con = opener.open(reqst) Type = con.headers.dict['content-type'][:5] Length = int(con.headers.dict['content-length']) if Length > 0: print(Length) print(Type) 檢視網頁圖片尺寸型別 #將圖片讀入記憶體 #!/usr/bin/env python #encoding=utf-8 import cStringIO, urllib2, Image url = 'http://www.01happy.com/wp-content/uploads/2012/09/bg.png' file = urllib2.urlopen(url) tmpIm = cStringIO.StringIO(file.read()) im = Image.open(tmpIm) print im.format, im.size, im.mode requests讀取網頁資訊 #Requests是一個Python的HTTP客戶端庫 #安裝: sudo pip install requests import requests r = requests.get('http://baidu.com') #r = requests.get('https://baidu.com', auth=('user', 'pass')) # https需登入加auth r.status_code # 狀態碼 r.headers # 網頁頭資訊 r.headers['content-type'] # 網頁頭資訊 r.headers['content-length'] # 網頁頭資訊 r.text # 網頁原始碼 r.content # 網頁原始碼 爬蟲 #!/usr/bin/env python #encoding:utf-8 #sudo pip install BeautifulSoup import requests from BeautifulSoup import BeautifulSoup import re baseurl = 'http://blog.sina.com.cn/s/articlelist_1191258123_0_1.html' r = requests.get(baseurl) for url in re.findall('<a.*?</a>', r.content, re.S): if url.startswith('<a title='): with open(r'd:/final.txt', 'ab') as f: f.write(url + '\n') linkfile = open(r'd:/final.txt', 'rb') soup = BeautifulSoup(linkfile) for link in soup.findAll('a'): #print link.get('title') + ': ' + link.get('href') ss = requests.get(link.get('href')) for content in re.findall('<div id="sina_keyword_ad_area2" class="articalContent ">.*?</div>', ss.content, re.S): with open(r'd:/myftp/%s.txt'%link.get('title').strip('<>'), 'wb') as f: f.write(content) print '%s has been copied.' % link.get('title') 反垃圾郵件提交申訴 #!/usr/bin/env python #encoding:utf-8 import requests import re IpList=['113.212.91.25','113.212.91.23'] QueryAdd='http://www.anti-spam.org.cn/Rbl/Query/Result' ComplaintAdd='http://www.anti-spam.org.cn/Rbl/Getout/Submit' data = { 'CONTENT':'''我們是一家正規的XXX。xxxxxxx。懇請將我們的傳送伺服器IP移出黑名單。謝謝! 處理措施: 1.XXXX。 2.XXXX。''', 'CORP':'abc.com', 'WWW':'www.abc.cm', 'NAME':'def', 'MAIL':'def@163.com.cn', 'TEL':'010-50000000', 'LEVEL':'0', } for Ip in IpList: query = requests.post(url=QueryAdd, data={'IP':Ip}) # 黑名單查詢 if query.ok: if re.findall(u'\u7533\u8bc9\u8131\u79bb', query.text, re.S): # 查詢關鍵字 申訴脫離 既表明在黑名單中 data['IP']=Ip complaint = requests.post(url=ComplaintAdd, data=data) # 提交申訴 if complaint.ok: if re.findall(u'\u60a8\u7684\u9ed1\u540d\u5355\u8131\u79bb\u7533\u8bf7\u5df2\u63d0\u4ea4', complaint.text, re.S): status='申請提交' elif re.findall(u'\u8131\u79bb\u7533\u8bf7\u5df2\u88ab\u4ed6\u4eba\u63d0\u4ea4', complaint.text, re.S): status='重複提交' elif re.findall(u'\u7533\u8bf7\u7531\u4e8e\u8fd1\u671f\u5185\u6709\u88ab\u62d2\u7edd\u7684\u8bb0\u5f55', complaint.text, re.S): status='近期拒絕' else: status='異常' else: status='正常' print '%s %s' %(Ip,status) 傳送郵件 傳送郵件內容 #!/usr/bin/python #encoding:utf8 # 匯入 smtplib 和 MIMEText import smtplib from email.mime.text import MIMEText # 定義傳送列表 mailto_list=["272121935@qq.com","272121935@163.com"] # 設定伺服器名稱、使用者名稱、密碼以及郵件字尾 mail_host = "smtp.163.com" mail_user = "mailuser" mail_pass = "password" mail_postfix="163.com" # 傳送郵件函式 def send_mail(to_list, sub): me = mail_user + "<"+mail_user+"@"+mail_postfix+">" fp = open('context.txt') msg = MIMEText(fp.read(),_charset="utf-8") fp.close() msg['Subject'] = sub msg['From'] = me msg['To'] = ";".join(to_list) try: send_smtp = smtplib.SMTP() send_smtp.connect(mail_host) send_smtp.login(mail_user, mail_pass) send_smtp.sendmail(me, to_list, msg.as_string()) send_smtp.close() return True except Exception, e: print str(e) return False if send_mail(mailto_list,"標題"): print "測試成功" else: print "測試失敗" 傳送附件 #!/usr/bin/python #encoding:utf8 import smtplib from email.mime.multipart import MIMEMultipart from email.mime.base import MIMEBase from email import encoders def send_mail(to_list, sub, filename): me = mail_user + "<"+mail_user+"@"+mail_postfix+">" msg = MIMEMultipart() msg['Subject'] = sub msg['From'] = me msg['To'] = ";".join(to_list) submsg = MIMEBase('application', 'x-xz') submsg.set_payload(open(filename,'rb').read()) encoders.encode_base64(submsg) submsg.add_header('Content-Disposition', 'attachment', filename=filename) msg.attach(submsg) try: send_smtp = smtplib.SMTP() send_smtp.connect(mail_host) send_smtp.login(mail_user, mail_pass) send_smtp.sendmail(me, to_list, msg.as_string()) send_smtp.close() return True except Exception, e: print str(e)[1] return False # 設定伺服器名稱、使用者名稱、密碼以及郵件字尾 mail_host = "smtp.163.com" mail_user = "xuesong" mail_pass = "mailpasswd" mail_postfix = "163.com" mailto_list = ["272121935@qq.com","quanzhou722@163.com"] title = 'check' filename = 'file_check.html' if send_mail(mailto_list,title,filename): print "傳送成功" else: print "傳送失敗" 解壓縮 gzip壓縮 import gzip f_in = open('file.log', 'rb') f_out = gzip.open('file.log.gz', 'wb') f_out.writelines(f_in) f_out.close() f_in.close() gzip壓縮1 File = 'xuesong_18.log' g = gzip.GzipFile(filename="", mode='wb', compresslevel=9, fileobj=open((r'%s.gz' %File),'wb')) g.write(open(r'%s' %File).read()) g.close() gzip解壓 g = gzip.GzipFile(mode='rb', fileobj=open((r'xuesong_18.log.gz'),'rb')) open((r'xuesong_18.log'),'wb').write(g.read()) 壓縮tar.gz import os import tarfile tar = tarfile.open("/tmp/tartest.tar.gz","w:gz") # 建立壓縮包名 for path,dir,files in os.walk("/tmp/tartest"): # 遞迴檔案目錄 for file in files: fullpath = os.path.join(path,file) tar.add(fullpath) # 建立壓縮包 tar.close() 解壓tar.gz import tarfile tar = tarfile.open("/tmp/tartest.tar.gz") #tar.extract("/tmp") # 全部解壓到指定路徑 names = tar.getnames() # 包內檔名 for name in names: tar.extract(name,path="./") # 解壓指定檔案 tar.close() zip壓縮 import zipfile,os f = zipfile.ZipFile('filename.zip', 'w' ,zipfile.ZIP_DEFLATED) # ZIP_STORE 為預設表不壓縮. ZIP_DEFLATED 表壓縮 #f.write('file1.txt') # 將檔案寫入壓縮包 for path,dir,files in os.walk("tartest"): # 遞迴壓縮目錄 for file in files: f.write(os.path.join(path,file)) # 將檔案逐個寫入壓縮包 f.close() zip解壓 if zipfile.is_zipfile('filename.zip'): # 判斷一個檔案是不是zip檔案 f = zipfile.ZipFile('filename.zip') for file in f.namelist(): # 返回檔案列表 f.extract(file, r'/tmp/') # 解壓指定檔案 #f.extractall() # 解壓全部 f.close() 時間 import time time.strftime('%Y-%m-%d_%X',time.localtime( time.time() ) ) 格式化時間 tomorrow.strftime('%Y%m%d_%H%M') 上一個月最後一天 import datetime lastMonth=datetime.date(datetime.date.today().year,datetime.date.today().month,1)-datetime.timedelta(1) lastMonth.strftime("%Y/%m") 前一天 (datetime.datetime.now() + datetime.timedelta(days=-1) ).strftime('%Y%m%d') 上個月 time.localtime()[1] - 1 時間戳轉換可讀時間 a=time.time() time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(a)) 編碼轉換 a='中文' # 編碼未定義按輸入終端utf8或gbk u=u'中文' # 定義為unicode編碼 u值為 u'\u4e2d\u6587' u.encode('utf8') # 轉為utf8格式 u值為 '\xe4\xb8\xad\xe6\x96\x87' print u # 結果顯示 中文 print u.encode('utf8') # 轉為utf8格式,當顯示終端編碼為utf8 結果顯示 中文 編碼不一致則亂碼 print u.encode('gbk') # 當前終端為utf8 故亂碼 ord('4') # 字元轉ASCII碼 chr(52) # ASCII碼轉字元 hash import md5 m = md5.new('123456').hexdigest() import hashlib m = hashlib.md5() m.update("Nobody inspects") # 使用update方法對字串md5加密 m.digest() # 加密後二進位制結果 m.hexdigest() # 加密後十進位制結果 hashlib.new("md5", "string").hexdigest() # 對字串加密 hashlib.new("md5", open("file").read()).hexdigest() # 檢視檔案MD5值 隱藏輸入密碼 import getpass passwd=getpass.getpass() 遍歷遞迴 [os.path.join(x[0],y) for x in os.walk('/root/python/5') for y in x[2]] for i in os.walk('/root/python/5/work/server'): print i Python處理訊號 訊號的概念 訊號(signal): 程式之間通訊的方式,是一種軟體中斷。一個程式一旦接收到訊號就會打斷原來的程式執行流程來處理訊號。 傳送訊號一般有兩種原因: 1(被動式) 核心檢測到一個系統事件.例如子程式退出會像父程式傳送SIGCHLD訊號.鍵盤按下control+c會傳送SIGINT訊號 2(主動式) 通過系統呼叫kill來向指定程式傳送訊號 作業系統規定了程式收到訊號以後的預設行為,可以通過繫結訊號處理函式來修改程式收到訊號以後的行為,有兩個訊號是不可更改的 SIGTOP 和 SIGKILL 如果一個程式收到一個SIGUSR1訊號,然後執行訊號繫結函式,第二個SIGUSR2訊號又來了,第一個訊號沒有被處理完畢的話,第二個訊號就會丟棄。 程式結束訊號 SIGTERM 和 SIGKILL 的區別: SIGTERM 比較友好,程式能捕捉這個訊號,根據您的需要來關閉程式。在關閉程式之前,您可以結束開啟的記錄檔案和完成正在做的任務。在某些情況下,假如程式正在進行作業而且不能中斷,那麼程式可以忽略這個SIGTERM訊號。 常見訊號 kill -l # 檢視linux提供的訊號 SIGHUP 1 A # 終端掛起或者控制程式終止 SIGINT 2 A # 鍵盤終端程式(如control+c) SIGQUIT 3 C # 鍵盤的退出鍵被按下 SIGILL 4 C # 非法指令 SIGABRT 6 C # 由abort(3)發出的退出指令 SIGFPE 8 C # 浮點異常 SIGKILL 9 AEF # Kill訊號 立刻停止 SIGSEGV 11 C # 無效的記憶體引用 SIGPIPE 13 A # 管道破裂: 寫一個沒有讀埠的管道 SIGALRM 14 A # 鬧鐘訊號 由alarm(2)發出的訊號 SIGTERM 15 A # 終止訊號,可讓程式安全退出 kill -15 SIGUSR1 30,10,16 A # 使用者自定義訊號1 SIGUSR2 31,12,17 A # 使用者自定義訊號2 SIGCHLD 20,17,18 B # 子程式結束自動向父程式傳送SIGCHLD訊號 SIGCONT 19,18,25 # 程式繼續(曾被停止的程式) SIGSTOP 17,19,23 DEF # 終止程式 SIGTSTP 18,20,24 D # 控制終端(tty)上按下停止鍵 SIGTTIN 21,21,26 D # 後臺程式企圖從控制終端讀 SIGTTOU 22,22,27 D # 後臺程式企圖從控制終端寫 預設處理動作一項中的字母含義如下: A 預設的動作是終止程式 B 預設的動作是忽略此訊號,將該訊號丟棄,不做處理 C 預設的動作是終止程式並進行核心映像轉儲(dump core),核心映像轉儲是指將程式資料在記憶體的映像和程式在核心結構中的部分內容以一定格式轉儲到檔案系統,並且程式退出執行,這樣做的好處是為程式設計師提供了方便,使得他們可以得到程式當時執行時的資料值,允許他們確定轉儲的原因,並且可以除錯他們的程式。 D 預設的動作是停止程式,進入停止狀況以後還能重新進行下去,一般是在除錯的過程中(例如ptrace系統呼叫) E 訊號不能被捕獲 F 訊號不能被忽略 Python提供的訊號 import signal dir(signal) ['NSIG', 'SIGABRT', 'SIGALRM', 'SIGBUS', 'SIGCHLD', 'SIGCLD', 'SIGCONT', 'SIGFPE', 'SIGHUP', 'SIGILL', 'SIGINT', 'SIGIO', 'SIGIOT', 'SIGKILL', 'SIGPIPE', 'SIGPOLL', 'SIGPROF', 'SIGPWR', 'SIGQUIT', 'SIGRTMAX', 'SIGRTMIN', 'SIGSEGV', 'SIGSTOP', 'SIGSYS', 'SIGTERM', 'SIGTRAP', 'SIGTSTP', 'SIGTTIN', 'SIGTTOU', 'SIGURG', 'SIGUSR1', 'SIGUSR2', 'SIGVTALRM', 'SIGWINCH', 'SIGXCPU', 'SIGXFSZ', 'SIG_DFL', 'SIG_IGN', '__doc__', '__name__', 'alarm', 'default_int_handler', 'getsignal', 'pause', 'signal'] 繫結訊號處理函式 #encoding:utf8 import os,signal from time import sleep def onsignal_term(a,b): print 'SIGTERM' # kill -15 signal.signal(signal.SIGTERM,onsignal_term) # 接收訊號,執行相應函式 def onsignal_usr1(a,b): print 'SIGUSR1' # kill -10 signal.signal(signal.SIGUSR1,onsignal_usr1) while 1: print 'ID',os.getpid() sleep(10) 通過另外一個程式傳送訊號 import os,signal os.kill(16175,signal.SIGTERM) # 傳送訊號,16175是繫結訊號處理函式的程式pid,需要自行修改 os.kill(16175,signal.SIGUSR1) 父程式接收子程式結束髮送的SIGCHLD訊號 #encoding:utf8 import os,signal from time import sleep def onsigchld(a,b): print '收到子程式結束訊號' signal.signal(signal.SIGCHLD,onsigchld) pid = os.fork() # 建立一個子程式,複製父程式所有資源操作 if pid == 0: # 通過判斷子程式os.fork()是否等於0,分別同時執行父程式與子程式操作 print '我是子程式,pid是',os.getpid() sleep(2) else: print '我是父程式,pid是',os.getpid() os.wait() # 等待子程式結束 接收訊號的程式,另外一端使用多執行緒向這個程式傳送訊號,會遺漏一些訊號 #encoding:utf8 import os import signal from time import sleep import Queue QCOUNT = Queue.Queue() # 初始化佇列 def onsigchld(a,b): '''收到訊號後向佇列中插入一個數字1''' print '收到SIGUSR1訊號' sleep(1) QCOUNT.put(1) # 向佇列中寫入 signal.signal(signal.SIGUSR1,onsigchld) # 繫結訊號處理函式 while 1: print '我的pid是',os.getpid() print '現在佇列中元素的個數是',QCOUNT.qsize() sleep(2) 多執行緒發訊號端的程式 #encoding:utf8 import threading import os import signal def sendusr1(): print '傳送訊號' os.kill(17788, signal.SIGUSR1) # 這裡的程式id需要寫前一個程式實際執行的pid WORKER = [] for i in range(1, 7): # 開啟6個執行緒 threadinstance = threading.Thread(target = sendusr1) WORKER.append(threadinstance) for i in WORKER: i.start() for i in WORKER: i.join() print '主執行緒完成' python使用memcache easy_install python-memcached # 安裝(python2.7+) import memcache mc = memcache.Client(['10.152.14.85:12000'],debug=True) mc.set('name','luo',60) mc.get('name') mc.delete('name1') 儲存資料 set(key,value,timeout) # 把key對映到value,timeout指的是什麼時候這個對映失效 add(key,value,timeout) # 僅當儲存空間中不存在鍵相同的資料時才儲存 replace(key,value,timeout) # 僅當儲存空間中存在鍵相同的資料時才儲存 獲取資料 get(key) # 返回key所指向的value get_multi(key1,key2,key3) # 可以非同步地同時取得多個鍵值, 比迴圈呼叫get快數十倍 python使用mongodb 原文: http://blog.nosqlfan.com/html/2989.html easy_install pymongo # 安裝(python2.7+) import pymongo connection=pymongo.Connection('localhost',27017) # 建立連線 db = connection.test_database # 切換資料庫 collection = db.test_collection # 獲取collection # db和collection都是延時建立的,在新增Document時才真正建立 文件新增, _id自動建立 import datetime post = {"author": "Mike", "text": "My first blog post!", "tags": ["mongodb", "python", "pymongo"], "date": datetime.datetime.utcnow()} posts = db.posts posts.insert(post) ObjectId('...') 批量插入 new_posts = [{"author": "Mike", "text": "Another post!", "tags": ["bulk", "insert"], "date": datetime.datetime(2009, 11, 12, 11, 14)}, {"author": "Eliot", "title": "MongoDB is fun", "text": "and pretty easy too!", "date": datetime.datetime(2009, 11, 10, 10, 45)}] posts.insert(new_posts) [ObjectId('...'), ObjectId('...')] 獲取所有collection db.collection_names() # 相當於SQL的show tables 獲取單個文件 posts.find_one() 查詢多個文件 for post in posts.find(): post 加條件的查詢 posts.find_one({"author": "Mike"}) 高階查詢 posts.find({"date": {"$lt": "d"}}).sort("author") 統計數量 posts.count() 加索引 from pymongo import ASCENDING, DESCENDING posts.create_index([("date", DESCENDING), ("author", ASCENDING)]) 檢視查詢語句的效能 posts.find({"date": {"$lt": "d"}}).sort("author").explain()["cursor"] posts.find({"date": {"$lt": "d"}}).sort("author").explain()["nscanned"] 斐波那契 #將函式結果作為列表可用於迴圈 def fab(max): n, a, b = 0, 0, 1 while n < max: yield b a, b = b, a + b n = n + 1 for n in fab(5): print n 乘法口訣 #!/usr/bin/python for i in range(1,10): for j in range(1,i+1): print j,'*',i,'=',j*i, else: print '' 最小公倍數 # 1-70的最小公倍數 def c(m,n): a1=m b1=n r=n%m while r!=0: n=m m=r r=n%m return (a1*b1)/m d=1 for i in range(3,71,2): d = c(d,i) print d PIL影象處理 import Image im = Image.open("j.jpg") # 開啟圖片 print im.format, im.size, im.mode # 列印影象格式、畫素寬和高、模式 # JPEG (440, 330) RGB im.show() # 顯示最新載入影象 box = (100, 100, 200, 200) region = im.crop(box) # 從影象中提取出某個矩形大小的影象 圖片等比縮小 # -*- coding: cp936 -*- import Image import glob, os #圖片批處理 def timage(): for files in glob.glob('D:\\1\\*.JPG'): filepath,filename = os.path.split(files) filterame,exts = os.path.splitext(filename) #輸出路徑 opfile = r'D:\\22\\' #判斷opfile是否存在,不存在則建立 if (os.path.isdir(opfile)==False): os.mkdir(opfile) im = Image.open(files) w,h = im.size #im_ss = im.resize((400,400)) #im_ss = im.convert('P') im_ss = im.resize((int(w*0.12), int(h*0.12))) im_ss.save(opfile+filterame+'.jpg') if __name__=='__main__': timage() 取系統返回值賦給序列 cmd = os.popen("df -Ph|awk 'NR!=1{print $5}'").readlines(); cmd = os.popen('df -h').read().split('\n') cmd = os.popen('lo 2>&1').read() #取磁碟使用空間 import commands df = commands.getoutput("df -hP") [ x.split()[4] for x in df.split("\n") ] [ (x.split()[0],x.split()[4]) for x in df.split("\n") if x.split()[4].endswith("%") ] 將列表去重複 list(set(['qwe', 'as', '123', '123'])) 將列表轉換成字串 '\t'.join(li) curses框 import curses myscreen = curses.initscr() # 初始化一個圖形框 myscreen.border(0) # 定義邊框寬度 myscreen.addstr(12, 25, "Python curses in action!") # 列印的位置 myscreen.refresh() # 使框生效 myscreen.getch() # 等待鍵盤輸入 curses.endwin() # 關閉 curses選單 #!/usr/bin/env python #menu.py from os import system import curses def get_param(prompt_string): screen.clear() screen.border(0) screen.addstr(2, 2, prompt_string) screen.refresh() input = screen.getstr(10, 10, 60) # 等待使用者輸入內容賦值變數 return input def execute_cmd(cmd_string): system("clear") a = system(cmd_string) print "" if a == 0: print "Command executed correctly" else: print "Command terminated with error" raw_input("Press enter") print "" x = 0 while x != ord('4'): # 字元轉ASCII碼 chr screen = curses.initscr() screen.clear() screen.border(0) screen.addstr(2, 2, "Please enter a number...") screen.addstr(4, 4, "1 - Add a user") screen.addstr(5, 4, "2 - Restart Apache") screen.addstr(6, 4, "3 - Show disk space") screen.addstr(7, 4, "4 - Exit") screen.refresh() x = screen.getch() if x == ord('1'): username = get_param("Enter the username") homedir = get_param("Enter the home directory, eg /home/nate") groups = get_param("Enter comma-separated groups, eg adm,dialout,cdrom") shell = get_param("Enter the shell, eg /bin/bash:") curses.endwin() execute_cmd("useradd -d " + homedir + " -g 1000 -G " + groups + " -m -s " + shell + " " + username) if x == ord('2'): curses.endwin() execute_cmd("apachectl restart") if x == ord('3'): curses.endwin() execute_cmd("df -h") curses.endwin() 列印表格 map = [["a","b","c"], ["d","e","f"], ["g","h","i"]] def print_board(): for i in range(0,3): for j in range(0,3): print "|",map[i][j], #if j != 2: print '|' 生成html檔案表格 log_file = file('check.html', 'w') log_file.write(""" <!DOCTYPE HTML> <html lang="utr-8"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <table align='center' border='0' cellPadding='0' style='font-size:24px;'><tr ><td>狀態統計</td></tr></table> <style>.font{font-size:13px}</style> <table align='center' border='1' borderColor=gray cellPadding=3 width=1350 class='font'> <tr style='background-color:#666666'> <th width=65>IP</th> <th width=65>狀態</th> </tr> """) for i in list: log_file.write('<tr><td>%s</td><td>%s</td></tr>\n' %(i.split()[0],i.split()[1]) ) log_file.write(""" </table> </body> </html> """) log_file.flush() log_file.close() 井字遊戲 #!/usr/bin/python # http://www.admin10000.com/document/2506.html def print_board(): for i in range(0,3): for j in range(0,3): print map[2-i][j], if j != 2: print "|", print "" def check_done(): for i in range(0,3): if map[i][0] == map[i][1] == map[i][2] != " " \ or map[0][i] == map[1][i] == map[2][i] != " ": print turn, "won!!!" return True if map[0][0] == map[1][1] == map[2][2] != " " \ or map[0][2] == map[1][1] == map[2][0] != " ": print turn, "won!!!" return True if " " not in map[0] and " " not in map[1] and " " not in map[2]: print "Draw" return True return False turn = "X" map = [[" "," "," "], [" "," "," "], [" "," "," "]] done = False while done != True: print_board() print turn, "'s turn" print moved = False while moved != True: print "Please select position by typing in a number between 1 and 9, see below for which number that is which position..." print "7|8|9" print "4|5|6" print "1|2|3" print try: pos = input("Select: ") if pos <=9 and pos >=1: Y = pos/3 X = pos%3 if X != 0: X -=1 else: X = 2 Y -=1 if map[Y][X] == " ": map[Y][X] = turn moved = True done = check_done() if done == False: if turn == "X": turn = "O" else: turn = "X" except: print "You need to add a numeric value" 網段劃分 題目 192.168.1 192.168.3 192.168.2 172.16.3 192.16.1 192.16.2 192.16.3 10.0.4 輸出結果: 192.16.1-192.16.3 192.168.1-192.168.3 172.16.3 10.0.4 答案 #!/usr/bin/python f = file('a.txt') c = f.readlines() dic={} for i in c: a=i.strip().split('.') if a[0]+'.'+a[1] in dic.keys(): key=dic["%s.%s" %(a[0],a[1])] else: key=[] key.append(a[2]) dic[a[0]+'.'+a[1]]=sorted(key) for x,y in dic.items(): if y[0] == y[-1]: print '%s.%s' %(x,y[0]) else: print '%s.%s-%s.%s' %(x,y[0],x,y[-1]) 統計日誌IP # 列印出獨立IP,並統計獨立IP數 219.140.190.130 - - [23/May/2006:08:57:59 +0800] "GET /fg172.exe HTTP/1.1" 200 2350253 221.228.143.52 - - [23/May/2006:08:58:08 +0800] "GET /fg172.exe HTTP/1.1" 206 719996 221.228.143.52 - - [23/May/2006:08:58:08 +0800] "GET /fg172.exe HTTP/1.1" 206 713242 #!/usr/bin/python dic={} a=open("a").readlines() for i in a: ip=i.strip().split()[0] if ip in dic.keys(): dic[ip] = dic[ip] + 1 else: dic[ip] = 1 for x,y in dic.items(): print x," ",y 列印a-z import string string.lowercase # a-z小寫 string.uppercase # A-Z大小