Python第十天 print >> f,和fd.write()的區別 stdout的buffer 標准輸入 標准輸出 從控制台重定向到文件 標准錯誤 重定向 輸出流和輸入流 捕獲sys.exit()調用 optparse argparse


Python第十天   print >> f,和fd.write()的區別    stdout的buffer  標准輸入 標准輸出  從控制台重定向到文件  標准錯誤   重定向 輸出流和輸入流  捕獲sys.exit()調用 optparse  argparse 

 

 

目錄

Pycharm使用技巧(轉載)

Python第一天  安裝  shell  文件

Python第二天  變量  運算符與表達式  input()與raw_input()區別  字符編碼  python轉義符  字符串格式化

Python第三天 序列  5種數據類型  數值  字符串  列表  元組  字典

Python第四天   流程控制   if else條件判斷   for循環 while循環

Python第五天   文件訪問    for循環訪問文件    while循環訪問文件   字符串的startswith函數和split函數

Python第六天   類型轉換

Python第七天   函數  函數參數   函數變量   函數返回值  多類型傳值    冗余參數   函數遞歸調用   匿名函數   內置函數   列表表達式/列表重寫

Python第八天  模塊   包   全局變量和內置變量__name__    Python path

Python第九天  面向對象  類定義   類的屬性    類的方法    內部類   垃圾回收機制   類的繼承 裝飾器

Python第十天   print >> f,和fd.write()的區別    stdout的buffer  標准輸入 標准輸出  標准錯誤   重定向 輸出流和輸入流

Python第十一天    異常處理  glob模塊和shlex模塊    打開外部程序和subprocess模塊  subprocess類  Pipe管道  operator模塊   sorted函數   生成器  walk模塊   hashlib模塊

Python第十二天     收集主機信息     正則表達式  無名分組   有名分組

Python第十三天   django 1.6   導入模板   定義數據模型   訪問數據庫   GET和POST方法    SimpleCMDB項目   urllib模塊   urllib2模塊  httplib模塊  django和web服務器整合  wsgi模塊   gunicorn模塊

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 :解析后的參數名稱,argparse默認的變量名是--或-后面的字符串,但是你也可以通過dest=xxx來設置參數的變量名,然后在代碼中用args.xxx來獲取參數的值
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()

 示例3

    



# 命令行參數
def opt():
    parser = argparse.ArgumentParser(description='insatll MongoDB')
    parser.add_argument('--disktype', '-dt',
                        dest="disktype",
                        metavar='',
                        required = True,
                        choices=['hdd', 'ssd'],
                        default='hdd',
                        help='mongodb install directory disk type, only hdd or ssd, default: hdd')
    parser.add_argument('--port',
                        dest="port",
                        metavar='', 
                        required = True,
                        type=int,
                        default='27017', 
                        help='mongodb port number, default: 27017')
    parser.add_argument('--version', '-v', 
                        dest="version",
                        metavar='', 
                        required = True,
                        choices=['3.4', '3.6', '4.0'],
                        default='4.0', 
                        help='mongodb version, only support 3.4 or 3.6 or 4.0, default: 4.0')
    parser.add_argument('--password', '-p', 
                        dest="password",
                        metavar='', 
                        required = True,
                        default='123456', 
                        help='mongodb adminuser  password, default: 123456')
    parser.add_argument('--role', '-r', 
                        dest="role",
                        metavar='', 
                        required = True,
                        choices=['master', 'slave'],
                        default='slave', 
                        help='mongodb install role, only master or slave, default: slave')
    parser.add_argument('--installenv', '-e',  
                        dest="installenv",
                        metavar='', 
                        required = True,
                        choices=['production', 'test'],
                        default='test', 
                        help='install environment, only production or test, default: test')
    args = parser.parse_args()
    return args

    
    

if __name__ == '__main__':
args = opt()

if (args.disktype and args.disktype.upper() in ['HDD', 'SSD']) \
        and \
        (args.port and str.isdigit(args.port)) \
        and \
        (args.version and args.version in ['3.4', '3.6', '4.0']) \
        and \
        (args.password) \
        and \
        (args.role and args.role.upper() in ['MASTER', 'SLAVE']) \
        and \
        (args.installenv and args.installenv.upper() in ['PRODUCTION', 'TEST']):
    disktype = args.disktype.upper()
    mongoport = args.port
    mongoversion = args.version
    mongopwd = args.password
    mongoip = get_host_ip()
    mongorole = args.role.upper()
    installenv = args.installenv.upper()

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM