20170216--PYthon 类 +面向对象编程+(文件的处理+echo小程序的实现)

PYthon 类 面向对象编程

1.封装

2.继承

3.重载/覆盖
 

class 机器:

    动力 = “”

    def 做事情():

    pass

洗衣机 = 机器 //洗衣机就是实例

print 洗衣机.动力

洗衣机.做事情()

封装:

100206_tRhe_2918364.png

继承:机器是洗衣机的父类,机器继承object(基类,最顶层的类)

100556_gqBX_2918364.png

类里面定义的函数就是类实例的方法。类里定义的方法第一个参数是默认的self

 

101137_sada_2918364.png

__init__(  )  //一个特殊的方法,当模块被调用的时候,最先执行的就是__init__()方法

__file__  //可以调用个这个方法查看我们调用的方法的路径

接口的封装

104836_feNm_2918364.png

比较完整的定义一个类的方法,注释也会出现在相应的帮助文档里

1 #!/usr/bin/env python
  2 # coding: utf8
  3 #
  4 """这是模块的文档字符串
  5 详细帮助请阅读源代码"""
  6 
  7 class JQ(object):
  8     """这是JQ类的文档字符串"""
  9     dong_li = "电"
 10 
 11     def add_dl(self):
 12         """增加动力的方法"""
 13         print "增加动力"
 14 
 15     def do(self):
 16         """这是机器做事情的方法"""
 17         print "我正在做事情"
 18 
 19 class XYJ(JQ):
 20     def do(self, abc):
 21         """这是洗衣机做事情的方法"""
 22         print "动力: " + self.dong_li
 23         self.add_dl()
 24         print "洗" + abc
 25 
 26 class QC(JQ):
 27     dong_li = "油"
 28 
 29     def do(self):
 30         """这是汽车做事情的方法"""
 31         print "动力: " + self.dong_li
 32         self.add_dl()
 33         print "Run..."
 34 
 35 
 36 if __name__ == "__main__":
 37     print "=======  bosspc"
 38     bosspc = JQ()
 39     print bosspc.dong_li
 40     bosspc.do()
 41 
 42     print "\n=======  haier_abc"
 43     haier_abc = XYJ()
 44     print haier_abc.dong_li
 45     haier_abc.do("脏衣服")
 46 
 47     print "\n=======  bmw_123"
 48     bmw_123 = QC()
 49     print bmw_123.dong_li
 50     bmw_123.do()

 

import commands //导入模块,可以在python 中使用shell命令还有subprocess ,是比较常用的shell模块

import shutil  //有copytree目录

  1 #!/usr/bin/python
  2 #_*_ coding:utf8 _*_
  3 #Filename:备份文件
  4 #
  5 import os
  6 import sys
  7 import commands
  8 import shutil
  9 
 10 if os.getuid() != 0:
 11     print "请使用超级用户运行!"
 12     sys.exit(1)
 13 
 14 srcfile = "/etc/"
 15 
 16 if not os.path.exists(srcfile):
 17     print "%s 文件不存在" % srcfile
 18     sys.exit(2)
 19 
 20 #status, output = commands.getstatusoutput("cp %s /tmp/" %srcfile)
 21 #
 22 #if status !=0:
 23 #    print "备份失败:%s" % output
 24 #    sys.exit(3)
 25 #
 26 #print "备份成功"
 27 #
 28 #try:
 29 #    shutil.copytree(srcfile,"/tmp/")
 30 #    print "备份成功"
 31 #except:
 32 #    print "备份失败"
 33 
 34 dstdir_name = os.path.basename(srcfile.rstrip("/"))  //取出备份文件的名字,去掉右边的/
 35 
 36 if os.path.isfile(srcfile):
 36 
 37 if os.path.isfile(srcfile):
 38     shutil.copy2(srcfile, "/tmp")
 39 elif os.path.isdir(srcfile):
 40     shutil.copytree(srcfile, os.path.join("/tmp", dstdir_name), symlinks=True)  //拷贝软链接,而不用去拷贝软链接对应的文件 。join函数,将函数名链接起来
 41 else:
 42     print "不支持备份这种文件!"
 43     sys.exit(4)
 44 
 45 print "备份成功"

 

python的一些参考手册

142631_J77Q_2918364.png

用这条命令可以将当前文件夹作为web的内容共享出来,访问的时候,只需要在输入本机的ip地址加8080端口就可以访问了。

144557_P4kj_2918364.png

模块的学习

1.临时文件模块

mktmp //在shell中生成临时文件

tmpfile //在python中生成临时文件的模块

           seek(0)//指针偏移到开头

152103_o2cO_2918364.png

 

152403_MvDj_2918364.png

 

>>> f = tempfile.TemporaryFile()  //用TemporaryFile()创建的文件没有文件名
>>> f.name
'<fdopen>'
>>> f.write("hello,everyone!\n")  //f.write 写入内容后,指针自动跳到字符串的末尾
>>> f.read()  //指针现在在字符串末尾,f.read 显示指针后面的内容,于是就什么都没有
''
>>> f.seek(0)  //我们将指针指到字符串的头部
>>> f.read()   //f.read 执行后,指针又跳到字符串的末尾
'hello,everyone!\n'
>>> f.write("world")
>>> f.seek(0)
>>> f.read()
'hello,everyone!\nworld'
>>> f.seek(0)
>>> f.write("kitty")
>>> f.read()
',everyone!\nworld'
>>> f.seek(0)
>>> f.read()
'kitty,everyone!\nworld'
>>> f.seek(0, 2)    //指针跳到字符串的末尾
>>> f.write(" xx")
>>> f.seek(0)
>>> f.read()
'kitty,everyone!\nworld xx'
>>>f.close()  //关闭临时文件,临时文件会被删除 

2.打开文件的方法,一般用第二种

152631_JjFd_2918364.png

方法一:打开文件,传入到参数后,要关闭文件,否则其他用户将无法使用


>>> f.close()
>>> f = open("/home/kate/txt/1.txt")
>>> data = f.read()
>>> f.close()
>>> print data
root
bin
daemon

方法二:这种方法打开文件,可以避免忘记关闭文件的风险

>>> with open("/home/kate/txt/2.txt") as g:
...   data = g.read()
...   print data
... 
root#
bin#
daemon#
adm#

3.时间模块

152804_zszN_2918364.png

把五天之后的时间,按照格式输出

>>> import datetime
>>> today = datetime.date.today()
>>> fiveday = datetime.timedelta(days=5)
>>> for_fiveday = today - fiveday
>>> after_fiveday = today + fiveday
>>> print for_fiveday ,today ,after_fiveday
2017-02-11 2017-02-16 2017-02-21
>>>

112616_GjO3_2918364.png

4.fnmatch ,glob  //文件名匹配

>>> import glob
>>> print glob.glob("*.txt")  //在当前目录中查找文件是.tx结尾的文件
[]
>>> print glob.glob("*.py")
['random123.py', '99plus.py', 'backup.py']
>>> print glob.glob("*.sh")
['myecho7.sh', 'if01.sh', 'test1.sh', 'random.sh', 'myecho1.sh', 'passwd+8.sh', 'shengxiao2.sh', 'shengxiao3.sh', 'case1.sh', 'backup.sh', 'test02.sh', '99plus.sh', 'sort_max.sh', 'myecho3.sh', 'if02.sh', 'dict.sh', 'shengxiao1.sh', 'myecho6.sh', 'filelock1.sh', 'myecho5.sh', 'tom.sh', 'filelock2.sh', 'find_max.sh', 'random+0213.sh', 'myecho4.sh']
>>> print glob.glob("????.sh")  //查找以.sh结尾,前面是四位数的文件
['if01.sh', 'if02.sh', 'dict.sh']
>>> 

os.walk 在指定的目录里递归遍历出指定的文件。是一个生成器,需要遍历出来。


#!/usr/bin/env python
  2 #coding:utf8
  3 #fnmatch函数的用法
  4 
  5 import os
  6 import fnmatch
  7 
  8 rm_files = []
  9 
 10 for root,dirs,files in os.walk("."):
 11   for filename in fnmatch.filter(files,"*.pyc"):
 12     rm_files.append(os.path.join(root,filename))
 13 
 14 print rm_files
 15 
 16 #for i in rm_files:
 17 # os.remove(i)
 18 
 19 map(os.remove,rm_files) //map的作用很强大,第一个参数是命令,后面跟参数
~                                                 

155920_rSu7_2918364.png

5.sys.argv 参数的传递

160418_rGfW_2918364.png

6.选项生成器optparse

 


[kate@up12 python]$ cat opt.py 
#!/usr/bin/env python
#coding: utf8
#选项生成器optparse
#

from optparse import OptionParser

parser = OptionParser()
parser.add_option("-f","--file",dest="filename",help="write report to FILE",metavar="FILE2")
parser.add_option("-q","--quiet",action="store_false",dest="verbose",default=True,help="don't print status messages to stdout")
parser.add_option("-v","--version")
parser.add_option("-s","--src",metavar="FILE",help="src file path")

#metavar 只是一个占位符而已,为了打印出来好看

options,args = parser.parse_args()

print options
print options.filename
print options.src
print options.verbose
print options.version
print '--------------------'
print args
[kate@up12 python]$ ./opt.py  -f /etc/passwd -v -s -q
{'src': None, 'version': '-s', 'verbose': False, 'filename': '/etc/passwd'}
/etc/passwd
None
False
-s
--------------------
[]
[kate@up12 python]$ 

backup

  1 #!/usr/bin/env python
  2 # coding: utf8
  3 #
  4 # backup /etc/shadow to /tmp
  5 # file read write append -> with
  6 # tempfile
  7 #
  8 
  9 from optparse import OptionParser
 10 
 11 import os
 12 import sys
 13 import commands
 14 import shutil
 15 
 16 if os.geteuid() != 0:
 17     print "请使用超级用户运行!"
 18     sys.exit(1)
 19 
 20 op = OptionParser()
 21 op.add_option("-s", "--src", help="src file path", metavar="FILE")
 22 op.add_option("-d", "--dst", help="dst dir path", metavar="DIR")
 23 
 24 options, args = op.parse_args()
 25 
 26 srcfile = options.src
 27 dstdir = options.dst
 28 
 29 if not srcfile or not dstdir:
 30     op.print_help()
 31     sys.exit(3)
 32 
 33 if not os.path.exists(srcfile):
 34     print "%s 文件不存在" % srcfile
 35     sys.exit(2)
 36 
 37 #status, output = commands.getstatusoutput("cp %s /tmp/" % srcfile)
38 
 39 #if  status != 0:
 40 #    print "备份失败: %s" % output
 41 #    sys.exit(3)
 42 #
 43 #print "备份成功"
 44 
 45 #try:
 46 #    shutil.copytree(srcfile, "/tmp/")
 47 #    print "备份成功"
 48 #except:
 49 #    print "备份失败"
 50 dstdir_name = os.path.basename(srcfile.rstrip("/"))
 51 
 52 if os.path.isfile(srcfile):
 53     shutil.copy2(srcfile, dstdir)
 54 elif os.path.isdir(srcfile):
 55     shutil.copytree(srcfile, os.path.join(dstdir, dstdir_name), symlinks=True)
 56 else:
 57     print "不支持备份这种文件!"
 58     sys.exit(4)
 59 
 60 print "备份成功"

 

7.用python写一个echo程序。

    我们把打印次数和打印行的功能写到一个程序里,颜色的显示我们写到另一个程序中,再进行调用

[kate@up12 python]$ ./myecho.py -c 6 --color red -n hello world
(1, 'hello world')
(2, 'hello world')
(3, 'hello world')
(4, 'hello world')
(5, 'hello world')
(6, 'hello world')
[kate@up12 python]$ cat myecho.py 
#!/usr/bin/env python
#coding: utf8
#myecho [-h|--help] [--color {red|green|yellow}] [-c|--count NUM] [-n] string...
#

from optparse import OptionParser

op = OptionParser()

colors =["red","green","yellow"]

op.add_option("--color",choices=colors,help="text color: %s " % "|".join(colors))
op.add_option("-c","--count" ,type=int,help="print count", metavar="NUM",default=1)
op.add_option("-n",dest="line",help="line number",action="store_true",default=False)


options, args = op.parse_args()

#print options

for i in range(1,options.count+1):
  if options.line:
    print(i," ".join(args))
  else:
    print(" ".join(args))
[kate@up12 python]$ 

显示颜色的程序

 1 #!/usr/bin/env python
  2 #coding: utf8
  3 #myecho程序中的颜色显示程序
  4 #
  5 
  6 from __future__ import print_function
  7 
  8 def cprint(*args,**kwargs):
  9   colors = ["red","green","yellow"]
 10   color = kwargs.get("color")
 11   if color is None:
 12     print(" ".join([ str(i) for i in args]))
 13 #如果没有指定颜色,我们就直接输出字符
 14     return
 15 
 16   if color not in colors:
 17     raise ValueError,"color must in:%s " % "|".join(colors)
 18 
 19   if color == "red":
 20     print("\033[31m",end="")
 21 #这里end以空结束,表示不换行
 22     print(" ".join([ str(i) for i in args ]))
 23   elif color == "green":
 24     print("\033[032m",end="")
 25     print(" ".join([ str(i) for i in args ]))
 26   elif color == "yellow":
 27     print("\033[033m",end="")
 28     print(" ".join( [ str(i) for i in args ]))
 29 
 30   print("\033[0m",end="")
 31 
 32 if __name__ == "__main__":
 33   cprint("Hello,world")
 34   cprint("hello")
 35   cprint("world")
 36   cprint("hello","world",11,22,33)
 37   cprint("hello","world",11,22,33,color="red")
 38   cprint("green","hello","world",11,22,33)
 39   import sys
 40   cprint(*sys.argv[1:])
 41   cprint(*sys.argv[1:],color="red")
 42   cprint(*sys.argv[1:],color="green")
 43   cprint(*sys.argv[1:],color="yellow")

                                                                        

pcolor 程序的运行结果

143824_MnsC_2918364.png

 

现在我们将颜色的程序import到我们的echo程序中

  1 #!/usr/bin/env python
  2 #coding: utf8
  3 #myecho [-h|--help] [--color {red|green|yellow}] [-c|--count NUM] [-n] string...
  4 #
  5 
  6 from optparse import OptionParser
  7 import pcolor
  8 
  9 op = OptionParser()
 10 
 11 colors =["red","green","yellow"]
 12 
 13 op.add_option("--color",choices=colors,help="text color: %s " % "|".join(colors))
 14 op.add_option("-c","--count" ,type=int,help="print count", metavar="NUM",default=1)
 15 op.add_option("-n",dest="line",help="line number",action="store_true",default=False)
 16 
 17 
 18 options, args = op.parse_args()
 19 
 20 #print options
 21 
 22 for i in range(1,options.count+1):  //将i行号从1开始定义
 23   if options.line:
 24     pcolor.cprint(i," ".join(args), color=options.color)
 25   else:
 26     pcolor.cprint(" ".join(args), color=options.color)

 

运行结果:

145326_WdTV_2918364.png

 

我们还可以将我们的两个程序合并为一个程序

#!/usr/bin/env python
  2 #coding: utf8
  3 #myecho [-h|--help] [--color {red|green|yellow}] [-c|--count NUM] [-n] string....
  4 #
  5 
  6 from __future__ import print_function
  7 from optparse import OptionParser
  8 
  9 def cprint(*args,**kwargs):
 10   colors = ["red","green","yellow"]
 11   color = kwargs.get("color")
 12   if color is None:
 13     print(" ".join([ str(i) for i in args ]))
 14     return
 15  
 16   if color not in colors:
 17     raise ValusError,"color must in :%s" % "|".join(colors)
 18 
 19   if color == "red":
 20     print("\033[31m", end="")
 21     print(" ".join([ str(i) for i in args ]))
 22   elif color == "green":
 23     print("\033[32m",end="")
 24     print(" ".join([ str(i) for i in args ]))
 25   elif color == "yellow":
 26     print("\033[33m",end="")
 27     print(" ".join([ str(i) for i in args ]))
 28 
 29   print("\033[0m",end="")
 30 
 31 op = OptionParser()
 32 
 33 colors = ["red","green","yellow"]
 34 
 35 op.add_option("--color",choices=colors,help="text color:%s" % "|".join(colors))
 36 op.add_option("-c","--count",type=int,help="print count",metavar="NUM",default=1)
 37 op.add_option("-n",dest="line",help="line number",action="store_true",default=False)
 38 
 39 options,args = op.parse_args()
 40 
 41 for i in range(1,options.count+1):
 42   if options.line:
 43     cprint(i," ".join(args),color=options.color)
 44   else:
 45     cprint(" ".join(args),color=options.color)

运行结果

170806_Z0K4_2918364.png

除了用OptionParser可以格式化我们的选项外,我们同样可以使用第三方模块click来处理我们的格式化

from pcolor import cprint
import click

@click.command()
@click.option("-c","--count",type=int,help="print count",metavar="NUM",default=1)
@click.option("-n",is_flag=True,help="print line num")
@click.option("--color",type=click.Choice(["red","green","yellow"]),help="print color")
@click.argument('mystrings',nargs=-1)// arguments是指定定长的参数,功能没有option强大。nargs=-1 表明参数 mystrings接收不定量的参数值,参数值会以 tuple 的形式传入函数。如果 nargs 大于等于 1,表示接收 nargs 个参数值

def echo(*args,**kwargs):
    color = kwargs.get("color")
    count = kwargs.get("count")
    line = kwargs.get("n")
    mystrings = kwargs.get("mystrings")

    for i in range(1,count+1):
        if line:
            cprint(i," ".join(mystrings),color = color)
        else:
            cprint(" ".join(mystrings),color = color)

if __name__ == "__main__":
    echo( )

我们也可以像上面一样,将显示颜色的功能函数添加进来,这次我们用click自带的函数click.secho() 可以显示颜色。

例:

import click

@click.command()
@click.option('--name', help='The person to greet.')
def hello(name):
    click.secho('Hello %s!' % name, fg='red', underline=True)
    click.secho('Hello %s!' % name, fg='yellow', bg='black')

if __name__ == '__main__':
    hello()

其中:

  • fg 表示前景颜色(即字体颜色),可选值有:BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE 等;
  • bg 表示背景颜色,可选值有:BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE 等;
  • underline 表示下划线,可选的样式还有:dim=Truebold=True 等;

 

# coding: utf8
__author__ = 'MAX'

import click
colors = ["red","green","yellow","blue","magenta"]

@click.command()
@click.option("-c","--count",type=int,help="print count ",metavar="NUM",default=1)
@click.option("-n",is_flag=True,help="print line num")
@click.option("--color",type=click.Choice(["red","green","yellow","blue","magenta"]),help="choice your favorite color %s " % "|".join(colors))
@click.argument('mystrings',nargs=-1)
def echo(*args,**kwargs):
    color = kwargs.get("color")
    count = kwargs.get("count")
    line = kwargs.get("n")
    mystrings = kwargs.get("mystrings")

    for i in range(1,count+1):
        if line:
            click.secho(i," ".join(mystrings),fg=color)
        else:
            click.secho(" ".join(mystrings),fg=color)

if __name__ == "__main__":
    echo()

 

 

 

 

8.用python写一个grep的软件,需要用到re 

re的一些方法,groups查看分组

104145_3s8N_2918364.png

104213_tiVS_2918364.png

match必须从开头开始写正则表达式

104416_1UCk_2918364.png

105121_rgOq_2918364.png

105427_Ajyg_2918364.png

我们自己来动手写一个grep功能的程序

#!/usr/bin/env python
#gerp.py 'regex' filepath


import re
import sys

if len(sys.argv) != 3:
  print "Usage:%s  'regex' filepath" % sys.argv[0]
  sys.exit(1)

pattern = sys.argv[1]
filepath = sys.argv[2]

myre = re.compile(pattern)

with open(filepath) as f:
  for line in f:
    if myre.search(line):
#   if re.search(pattern,line): //这种匹配方法,每打印一句都会去进行匹配一次,效率太低,我们将不会采用这种方法
      print line

 

 

 

我们自己写的grep程序,运行脚本时,前面写要匹配的字段,后面跟上文件夹就可以,匹配我们想要匹配字段的所在行了,在打印行的时候,不加“,”会默认输出换行符,我们家上“,”后就不会输出换行符了

180747_DKiN_2918364.png

性能最好的是grep>sed>python>awk

111244_Ncaf_2918364.png

 

9.awk

150232_z3hf_2918364.png

#!/usr/bin/env python
#coding: utf8
#打印/etc/passwd 文件中,uid大于500的用户


with open("/etc/passwd") as f:
  for line in f:
    data = line.split(":")
    if int(data[2]) > 500:
      print data[0],data[6]

 

182928_Vx2F_2918364.png

 

我们可以自己指定文件,和指定分隔符,以及要显示的列,将awk的功能更加完善


#!/usr/bin/env python
# coding: utf8


from optparse import OptionParser

op = OptionParser()
op.add_option("-F",dest="sep",help="指定分隔符")
op.add_option("-f",dest="fn",help="指定列号,eg:3 or 1,7",default="0")

options,args = op.parse_args()

if len(args) !=1:
  op.print_help()
  exit(1)

with open(args[0]) as f:
  for line in f:
    data = line.split(options.sep)
    if options.fn == 0:
      print line,
    else:
      fn = options.fn.split(",")
      for n in fn:
        print data[int(n)-1].rstrip("\n"),
      print

 

 

10.在python中用envoy模块运行shell命令,因为这个模块比较好用

152714_e7Yc_2918364.png

 

154300_9pkL_2918364.png

转载于:https://my.oschina.net/liubaizi/blog/840314

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值