python 学习之glob、dir、getattr、callable、正则表达式

来源:互联网 发布:ubuntu的cp命令 编辑:程序博客网 时间:2024/06/06 07:04

python语言含有丰富的语法规则和简洁实用的表达方式,opencv与python的结合可以做很多事情,opencv2.4.10所带的python实例中有部分程序,阅读实例的同时可以学习到优美的python语法,其中第一个程序_converage如下:

from glob import globimport cv2import reif __name__ == '__main__':    cv2_callable = set(['cv2.'+name for name in dir(cv2) if callable( getattr(cv2, name) )])    found = set()    for fn in glob('*.py'):        print ' --- ', fn        code = open(fn).read()        found |= set(re.findall('cv2?\.\w+', code))    cv2_used = found & cv2_callable    cv2_unused = cv2_callable - cv2_used    with open('unused_api.txt', 'w') as f:        f.write('\n'.join(sorted(cv2_unused)))    r = 1.0 * len(cv2_used) / len(cv2_callable)    print '\ncv2 api coverage: %d / %d  (%.1f%%)' % ( len(cv2_used), len(cv2_callable), r*100 )    print '\nold (cv) symbols:'    for s in found:        if s.startswith('cv.'):            print s
该程序计算的是API的覆盖范围并且计算了旧版本的opencv函数在所有python_opencv程序中使用的范围。直接运行可以得到如下:



程序解析如下:

1.glob

glob模块是最简单的模块之一,内容非常少。用它可以查找符合特定规则的文件路径名。第9行中for fn in glob('*.py')就是寻找以.py结尾的所有文件。在cmd中使用python可以查看glob模块的使用方法。

glob.glob
  返回所有匹配的文件路径列表。它只有一个参数pathname,定义了文件路径匹配规则,这里可以是绝对路径,也可以是相对路径。下面是使用glob.glob的例子:

import glob    #获取指定目录下的所有图片  print glob.glob(r"E:\Picture\*\*.jpg")    #获取上级目录的所有.py文件  print glob.glob(r'../*.py') #相对路径  

glob.iglob   

       获取一个可编历对象,使用它可以逐个获取匹配的文件路径名。与glob.glob()的区别是:glob.glob同时获取所有的匹配路径,而 glob.iglob一次只获取一个匹配路径。这有点类似于.NET中操作数据库用到的DataSet与DataReader。下面是一个简单的例子:

import glob    #父目录中的.py文件  f = glob.iglob(r'../*.py')    print f #<generator object iglob at 0x00B9FF80>  for py in f:      print py  

2.dir

dir()不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。如果参数包含方法__dir__(),该方法将被调用。如果参数不包含__dir__(),该方法将最大限度地收集参数信息。

本例中dir(cv2)即获取cv2模块中的信息,在cmd中可以做如下测试:

import cv2dir()dir(cv2)
可以看到输出结果如下:


最后输出的是所有cv2中模块的名字。

另外的应用实例如下,可以帮助理解:

>>> dir()['__builtins__', '__doc__', '__name__', '__package__']>>> import struct>>> dir()['__builtins__', '__doc__', '__name__', '__package__', 'struct']>>> dir(struct)['Struct', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '_clearcache', 'calcsize', 'error', 'pack', 'pack_into', 'unpack', 'unpack_from']>>> class Person(object):...     def __dir__(self):...             return ["name", "age", "country"]...>>> dir(Person)['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__','__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']>>> tom = Person()>>> dir(tom)['age', 'country', 'name']
3.getattr
getattr用于获取对象引用,使用实例如下:

class A:       def __init__(self):           self.name = 'zhangjing'      #self.age='24'    def method(self):           print"method print"    Instance = A()   print getattr(Instance , 'name, 'not find') #如果Instance 对象中有属性name则打印self.name的值,否则打印'not find'print getattr(Instance , 'age', 'not find')   #如果Instance 对象中有属性age则打印self.age的值,否则打印'not find'print getattr(a, 'method', 'default')   #如果有方法method,否则打印其地址,否则打印default   print getattr(a, 'method', 'default')()   #如果有方法method,运行函数并打印None否则打印default  
程序第6行中的程序getattr(cv2, name),获取cv2模块中的信息

4.callable(object)

检查对象object是否可调用。如果返回True,object仍然可能调用失败;但如果返回False,调用对象ojbect绝对不会成功

方便理解函数的实例如下:

>>> callable(0)False>>> callable("mystring")False>>> def add(a, b):…     return a + b…>>> callable(add)True>>> class A:…      def method(self):…         return 0…>>> callable(A)True>>> a = A()>>> callable(a)False>>> class B:…     def __call__(self):…         return 0…>>> callable(B)True>>> b = B()>>> callable(b)True
5.正则表达式

import re是python中特有的正则表达式模式。正则表达式是搜索具有一定格式的字符表达式,正则表达式有着特殊de符号含义,使用规则比较复杂,这里只解释程序中提到的几项

首先是re.findall

>>> import re  >>> s = "adfad asdfasdf asdfas asdfawef asd adsfas "    >>> reObj1 = re.compile('((\w+)\s+\w+)')  >>> reObj1.findall(s)  [('adfad asdfasdf', 'adfad'), ('asdfas asdfawef', 'asdfas'), ('asd adsfas', 'asd')]    >>> reObj2 = re.compile('(\w+)\s+\w+')  >>> reObj2.findall(s)  ['adfad', 'asdfas', 'asd']    >>> reObj3 = re.compile('\w+\s+\w+')  >>> reObj3.findall(s)  ['adfad asdfasdf', 'asdfas asdfawef', 'asd adsfas']  

findall函数返回的总是正则表达式在字符串中所有匹配结果的列表,此处主要讨论列表中“结果”的展现方式,即findall中返回列表中每个元素包含的信息。

上述实例的区别详细解释如下:

@1.当给出的正则表达式中带有多个括号时,列表的元素为多个字符串组成的tuple,tuple中字符串个数与括号对数相同,字符串内容与每个括号内的正则表达式相对应,并且排放顺序是按括号出现的顺序。

@2.当给出的正则表达式中带有一个括号时,列表的元素为字符串,此字符串的内容与括号中的正则表达式相对应(不是整个正则表达式的匹配内容)。

@3.当给出的正则表达式中不带括号时,列表的元素为字符串,此字符串为整个正则表达式匹配的内容。

正则表达式的符号匹配含义部分如下所示:





参考文章:

http://www.cnblogs.com/zhangjing0502/archive/2012/05/16/2503702.html

http://www.pythontab.com/html/2013/hanshu_0221/244.html

http://blog.csdn.net/cashey1991/article/details/8875213

http://blog.csdn.net/csapr1987/article/details/7469769


0 0
原创粉丝点击