目錄html
Pycharm使用技巧(轉載)python
Python次日 變量 運算符與表達式 input()與raw_input()區別 字符編碼 python轉義符 字符串格式化正則表達式
Python第三天 序列 5種數據類型 數值 字符串 列表 元組 字典shell
Python第四天 流程控制 if else條件判斷 for循環 while循環數據庫
Python第五天 文件訪問 for循環訪問文件 while循環訪問文件 字符串的startswith函數和split函數django
Python第六天 類型轉換bash
Python第七天 函數 函數參數 函數變量 函數返回值 多類型傳值 冗餘參數 函數遞歸調用 匿名函數 內置函數 列表表達式/列表重寫服務器
Python第八天 模塊 包 全局變量和內置變量__name__ Python pathssh
Python第九天 面向對象 類定義 類的屬性 類的方法 內部類 垃圾回收機制 類的繼承 裝飾器
Python第十天 print >> f,和fd.write()的區別 stdout的buffer 標準輸入 標準輸出 標準錯誤 重定向 輸出流和輸入流
Python第十二天 收集主機信息 正則表達式 無名分組 有名分組
Python第十四天 序列化 pickle模塊 cPickle模塊 JSON模塊 API的兩種格式
Python第十五天 datetime模塊 time模塊 thread模塊 threading模塊 Queue隊列模塊 multiprocessing模塊 paramiko模塊 fabric模塊
輸出流和輸入流
cat 12.rpm |ssh 192.168.2.6 "cat - >/tmp/12.rpm"
函數名:若是由多個單詞組成,第二個單詞的首字母應該大寫
類名:若是由多個單詞組成,每一個單詞的首字母應該大寫
變量名:所有小寫或者單詞之間用下劃線
#!/usr/bin/python和#!/usr/bin/env python的區別
/usr/bin/env表示到$PATH環境變量去找python執行文件,若是當前系統有兩套python,那麼不須要更改腳本內容
若是使用/usr/bin/python 絕對路徑,就須要更改腳本
bash也有這種用法:#!/bin/bash和#!/usr/bin/env bash
Python如何處理管道輸入輸出
Python處理命令行參數
OS.path對文件路徑的處理
逐步實現python版的wc命令
示例 1 #!/usr/bin/env python # -*- coding:utf-8 -*- #__author__="huazai" """ pycharm 使用指南 Date:2016.08.12 """ import sys #sys.stdin 就是一個文件類,Linux裏一切皆文件 #input = sys.stdin input保存爲文件描述符對象,至關於一個類sys.stdin實例化爲一個對象input #讀取input時候按ctrl+d終止輸入 input = sys.stdin def lineCount(f): n = 0 for i in f: n += 1 return n print lineCount(input)
從標準輸入讀取
示例 2 #!/usr/bin/env python # -*- coding:utf-8 -*- #__author__="huazai" """ pycharm 使用指南 Date:2016.08.12 """ import sys fd = sys.stdin data = fd.read() sys.stdout.write(data+"\n") print "你好"
文件對象的方法:
f.read() 按ctrl+d終止輸入 ,f.read(10) 讀取文件的10個字符,再運行第二次讀取後10個字符,再運行第三次讀取後10個字符,以此類推
f.readline() //用while遍歷每一行
f.readlines() 與[i for i in f] //對文件每一行進行遍歷
f.write()
f.close()
輸出
#!/usr/bin/env python # -*- coding:utf-8 -*- # __author__="huazai" """ pycharm 使用指南 Date:2016.08.12 """ import os import sys import string import gc import sys print "hello world" sys.stdout.write("Hello world"+'\n') sys.stderr.write("Hello Error")
標準輸出和標準錯誤輸出
sys.stdout.write(str) :參數是字符串
sys.stderr.write(str):參數是字符串
print和stdout的區別
print一般是調用一個stdout對象的write方法
print會先進行格式轉換
print會在最後加上換行符,要加逗號才能屏蔽換行符,等價於sys.stdout.write('hello'+'\n')
從控制檯重定向到文件
在當前文件下新生成一個文件out.log,文件內容爲hello
import sys
f_handler=codecs.open('out.log','w')
sys.stdout=f_handler
print 'hello'
捕獲sys.exit()調用
執行到程序末尾,解釋器自動退出,可是若是退出程序前執行某些操做,能夠調用
sys.exit函數,帶有一個可選整數參數返回給調用他的程序,表示你能夠在主程序中捕獲對sys.exit的調用,0是正常退出,其餘爲異常
def exitfunc():
print 'hello'
if __name__ == '__main__':
sys.exitfunc = exitfunc() # 設置捕獲時調用的函數
print 'aaaaaa'
sys.exit(1) # 退出前調用exitfunc()函數,而後退出
print 'there' # 這句不會執行
print >> f,和fd.write()的區別
fd.write()只能輸入字符串,輸入數字要先用str()函數轉換爲字符串或者或者格式化("%d\n" % i)
print >> fd,能夠直接輸入int
print >> fd,"Hello world, I'm writting to file",11,200,300,400,500
fd = codecs.open('tmp','w')
fd.write('123')
示例
#!/usr/bin/env python # -*- coding:utf-8 -*- # __author__="huazai" """ pycharm 使用指南 Date:2016.08.12 """ import os import sys with open('F:\ a.txt', 'a') as f: #以寫的方式打開 print >> f, "Hello world, I'm writting to file", 11 # 用print往文件描述符裏寫內容,能夠輸入數字 #等價於 f.write("Hello world, I'm writting to file: "+str(11)) # 用write不能輸入數字要先str函數轉換爲字符串或者格式化("%d\n" % i) print >> sys.stderr, "Hello world, I'm writting to file", 11 # 向標準錯誤輸入內容
stderr和重定向
#!/usr/bin/env python import sys print >> sys.stderr, "I am going to stderr" sys.stdout.write("I am standard output\n") python print2stderr.py 2> /dev/null
#寫入到標準錯誤
print >> sys.stderr ,"Hello world, I'm writting to file",11,200,300,400,500 python xx.py 2>/dev/null 能夠重定向
------------------------------------------------------
stdout的buffer
python命令的-u 選項
文件對象的.flush() 方法
#!/usr/bin/env python # -*- coding:utf-8 -*- # __author__="huazai" """ pycharm 使用指南 Date:2016.08.12 """ import os import sys import time for i in range(1,10): sys.stdout.write("str:%d\n" % i) time.sleep(1) sys.stdout.flush() # # python buffer.py | cat - # python -u buffer.py | cat - # -u表示不須要buffer
--------------------------------------------------
簡單的word count
day04:包名
wc:模塊名
wordCount:函數名
from day04 import wc
#!/usr/bin/env python # -*- coding:utf-8 -*- #__author__="huazai" """ pycharm 使用指南 Date:2016.08.12 """ from sys import stdin data = stdin.read() chars = len(data) words = len(data.split()) lines = data.count('\n') print "%(lines)s %(words)s %(chars)s" % locals() 或者 print "%(lines)s %(words)s %(chars)s" % {'lines':lines,'words':words,'chars':chars} #能夠用管道符進行調用cat /etc/hosts |python wc.py
locals()返回一個字典對象,表明當前的變量狀況
#!/usr/bin/python
import sys
data = sys.stdin.read()
chars = len(data)
words = len(data.split())
lines = data.count('\n')
print "%(lines)s %(words)s %(chars)s" % locals()
locals()返回一個字典對象,表明當前的變量狀況
下面兩種方法均可以
print "%s %s %s " %(chars,words,lines)
print "%(lines)s %(words)s %(chars)s" % locals()
#!/usr/bin/env python # -*- coding:utf-8 -*- #__author__="huazai" """ 從標準輸入或參數讀取文件內容 Date:2016.08.12 """ #!/usr/bin/python import sys import os if len(sys.argv) < 2: data = sys.stdin.read() else : try: fn = sys.argv[1] except IndexError: print "please follow a argument at %s" % __file__ # __file__內置變量表示腳本名 sys.exit() if not os.path.exists(fn): print "%s is not exists" % fn sys.exit() with open(fn) as fd: data = fd.read() chars = len(data) words = len(data.split()) lines = data.count('\n') print "%(lines)s %(words)s %(chars)s" % locals() # print sys.argv 返回一個列表 ,argv自己是一個屬性
--------------------------------------------------------
optparse
(2.7版本後將被移除)
真正的命令行參數,代替sys.argv[],好比 ls /etc/passwd -l,sys.argv[]只能獲取到參數的索引位置,可是準確位置沒法獲取,
好比獲取-l參數,-l能夠寫在前面又能夠寫在後面
ls /etc/passwd -l ,ls -l /etc/passwd
OptionParser是一個類
-c、--chars:命令行選項
dest:爲選項定義變量名,值characters就是’-c’選項的名字,同理,words就是‘-w’選項的名字,lines就是‘-l’選項的名字,每一個選項就是一個變量,選項的值就是變量的值
default=False:characters的默認值False,意思是默認狀況下命令不帶-c選項
help:選項的解釋說明部分
改寫wc程序
支持 -l -w -l選項
支持文件參數和管道輸入
多文件計算總行數
程序中使用函數
示例1 #!/usr/bin/env python # -*- coding:utf-8 -*- #__author__="huazai" """ 從標準輸入或參數讀取文件內容 Date:2016.08.12 """ from optparse import OptionParser import sys, os # parser = OptionParser() parser = OptionParser("Usage: %prog [file1] [file2]...") parser.add_option("-c", "--chars", dest="characters", action="store_true", default=False, help="only count characters", ) parser.add_option("-w", "--words", dest="words", action="store_true", default=False, help="only count words", ) parser.add_option("-l", "--lines", dest="lines", action="store_true", default=False, help="only count lines", ) options, args = parser.parse_args() # 返回選項字典 options是一個類 能夠直接調用選項(options.words)和參數列表 print options, args, if not (options.characters or options.words or options.lines): options.characters, options.words, options.lines = True, True, True data = sys.stdin.read() chars = len(data) words = len(data.split()) lines = data.count('\n') if options.lines: print lines, if options.words: print words, if options.characters: print chars, 調用方式:cat /etc/passwd |python wc.py 示例2 #!/usr/bin/env python # -*- coding:utf-8 -*- # __author__="huazai" """ pycharm 使用指南 Date:2016.08.12 """ import sys import os from optparse import OptionParser def opt(): parser = OptionParser("Usage: %prog [option] [file1] [file2]") parser.add_option("-c", "--char", dest="chars", action="store_true", default=False, help="only count chars") parser.add_option("-w", "--word", dest="words", action="store_true", default=False, help="only count words") parser.add_option("-l", "--line", dest="lines", action="store_true", default=False, help="only count lines") options, args = parser.parse_args() return options, args def get_count(data): chars = len(data) words = len(data.split()) lines = data.count('\n') return lines, words, chars def print_wc(options, lines, words, chars, fn): if options.lines: print lines, if options.words: print words, if options.chars: print chars, print fn def main(): options, args = opt() if not (options.lines or options.words or options.chars): options.lines, options.words, options.chars = True, True, True if args: total_lines, total_words, total_chars = 0, 0, 0 for fn in args: if os.path.isfile(fn): with open(fn) as fd: data = fd.read() lines, words, chars = get_count(data) print_wc(options, lines, words, chars, fn) total_lines += lines total_words += words total_chars += chars elif os.path.isdir(fn): print >> sys.stderr, "%s: is a directory" % fn else: sys.stderr.write("%s: No such file or direcotry\n" % fn) if len(args) > 1: print_wc(options, total_lines, total_words, total_chars, 'total') else: data = sys.stdin.read() fn = '' lines, words, chars = get_count(data) print_wc(options, lines, words, chars, fn) if __name__ == '__main__': main() #main()函數不想讓其餘模塊調用,不加if __name__ == '__main__':,那麼import wc這個模塊的時候就會自動執行main()這個函數
注意:OptionParser不能使用-h選項,由於他內置了一個幫助選項,就是-h
parser.add_option("-h", "--host", # 改成-H ,‘--Host’
dest="host",
action="store",
default='127.0.0.1',
help="host address")
print "%s -h" % __file__
sys.exit(1)
否則會報錯,參數衝突:optparse.OptionConflictError: option -h/--host: conflicting option string(s): -h
系統中的wc命令用C語言寫
argparse
替代過期的optparse
使用argparse 解析命令行參數時,首先須要建立一個解析器,建立方式以下所示:
import argparse
parser = argparse.ArgumentParser()
class ArgumentParser(prog=None, usage=None, description=None, epilog=None, parents=[], formatter_class=argparse.HelpFormatter, prefix_chars='-', fromfile_prefix_chars=None, argument_default=None, conflict_handler='error', add_help=True)
prog :文件名,默認爲sys.argv[0],用來在help信息中描述程序的名稱。
usage :描述程序用途的字符串
description :help信息前顯示的信息
epilog :help信息以後顯示的信息
parents :由ArgumentParser對象組成的列表,它們的arguments選項會被包含到新ArgumentParser對象中。(相似於繼承)
formatter_class :help信息輸出的格式,爲了美觀…
prefix_chars :參數前綴,默認爲'-'(最好不要修改)
fromfile_prefix_chars :前綴字符,放在文件名以前,當參數過多時,能夠將參數放到文件中讀取,例子中parser.parse_args([‘-f’, ‘foo’, ‘@args.txt’])解析時會從文件args.txt讀取,至關於 [‘-f’, ‘foo’, ‘-f’, ‘bar’]
conflict_handler :解決衝突的策略,默認狀況下衝突會發生錯誤,(最好不要修改)
add_help :是否增長-h/-help選項 (默認爲True),通常help信息都是必須的。設爲False時,help信息裏面再也不顯示-h –help信息
argument_default: - (default: None)設置一個全局的選項的缺省值,通常每一個選項單獨設置,基本沒用
ArgumentParser的一些方法
ArgumentParser.add_subparsers([title][, description][, prog][, parser_class][, action][, option_string][, dest][, help][, metavar])
ArgumentParser.add_argument_group(title=None, description=None)
ArgumentParser.add_mutually_exclusive_group(required=False) 互斥選項
ArgumentParser.set_defaults(**kwargs)
ArgumentParser.parse_known_args(args=None, namespace=None)
ArgumentParser.convert_arg_line_to_args(arg_line)
爲應用程序添加參數選項須要用ArgumentParser 對象的add_argument 方法,該方法原型以下:
ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
各個參數的含義以下:
name/flags :參數名字,參數有兩種,可選參數和位置參數
添加可選參數
parser.add_argument('-f', '--foo')
添加位置參數
parser.add_argument('bar')
action : 遇到參數時的動做,默認值是store
help: 參數的幫助信息
version:參數版本
metaver:在usage 說明中的參數名稱
nargs: 參數的個數,能夠是具體的數字,或者是'+' 號與'*' 號。其中,'*'號表示0 或多個參數,'+'號表示l 或多個參數
const :保存一個常量
default :不指定參數時的默認值
type :參數的類型,默認爲str
required :該選項是否必選,默認爲True
dest :解析後的參數名稱
choices :設置參數值的範圍,若是choices中的類型不是字符串,記得指定type
parser.add_argument('x', type=int, choices=range(1, 4))
解析參數
解析參數須要用ArgumentParser 對象的parse_args 方法,該方法返回一個Namespace對象。
獲取對象之後,參數值經過屬性的方式進行訪問
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('x')
>>> a = parser.parse_args(['1'])
>>> a
Namespace(x='1')
>>> type(a)
<class 'argparse.Namespace'>
>>> a.x
'1'
示例1
import argparse def _argparse(): parser = argparse.ArgumentParser (description='This is descript') parser.add_argument( '--host', action='store',dest='server', required=True ,default='localhost', help='connect to host') parser.add_argument ('-t', action='store_true',default=False , dest ='boolean_switch', help= 'set a switch to true') parser.add_argument('--thread_size', action='store', dest='thread_size',default=5, type=int, help='how much connection for database usage') parser.add_argument('-v','--version' , action='version', version='%(prog)s 0.1') return parser.parse_args() def main(): parser = _argparse() print(parser) print ('host =',parser.server) print ('boolean_switch=',parser.boolean_switch) if __name__ == 'main': main()
示例2
#!/usr/bin/python # -*- coding: utf-8 -*- import sys import argparse def cmd(): args = argparse.ArgumentParser(description = 'Personal Information ',epilog = 'Information end ') #必寫屬性,第一位 args.add_argument("name", type = str, help = "Your name") #必寫屬性,第二位 args.add_argument("birth", type = str, help = "birthday") #可選屬性,默認爲None args.add_argument("-r",'--race', type = str, dest = "race", help = u"民族") #可選屬性,默認爲0,範圍必須在0~150 args.add_argument("-a", "--age", type = int, dest = "age", help = "Your age", default = 0, choices=range(150)) #可選屬性,默認爲male args.add_argument('-g',"--gender", type = str, dest = "gender", help = 'Your gender', default = 'male', choices=['male', 'female']) #可選屬性,默認爲None,-p後可接多個參數 args.add_argument("-p","--parent",type = str, dest = 'parent', help = "Your parent", default = "None", nargs = '*') #可選屬性,默認爲None,-o後可接多個參數 args.add_argument("-o","--other", type = str, dest = 'other', help = "other Information",required = False,nargs = '*') args = args.parse_args()#返回一個命名空間,若是想要使用變量,可用args.attr print "argparse.args=",args,type(args) print 'name = %s'%args.name d = args.__dict__ for key,value in d.iteritems(): print '%s = %s'%(key,value) if __name__=="__main__": cmd()
optparse模塊和argparse模塊比較
https://docs.python.org/2/library/argparse.html#argparse.ArgumentParser.add_subparsers
optparse.OptionParser.add_option() 替換爲 ArgumentParser.add_argument()
(options, args) = parser.parse_args() 替換爲 args = parser.parse_args()
optparse.OptionError optparse.OptionValueError 替換爲 ArgumentError異常
OptionParser constructor version 參數 替換爲 parser.add_argument('--version', action='version', version='<the version>')
python bb.py --version
3
f