您的位置:首页 > 编程语言 > Python开发

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

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

from glob import glob
import cv2
import re

if __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 cv2
dir()
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: