'''
coding by Aris on 20140125
#staffInfo.txt 文件内容如下
ID Name Phone Department
001 Su Jin 13875412322 IT
002 Aris 13403124431 Sale
003 Jone Huang 13876541232 HR
004 Aris 13423419345 IT
'''
#testStaff
def isMatch(fname):
import os
os.chdir(r'c:\Python34\Examples') #切换存放测试数据文件为当前工作目录
isExist=os.path.exists(fname) #所以输入的文件名字就不需要时绝对路径,短名就可以了
if isExist:
print ('I wil open',fname,'.')
else:
print ('Sorry. File is not exist.')
return False #判断文件是否存在,如果不存在 函数返回false 方便后面处理这种情况
def readFile(): #读取文件 因为不清楚文件大小,如果文件特别大,全部读入内存可能会造成可怕后果
with open(fname) as fin:
temp=fin.readline()
while temp:
yield temp #因此这里采用了生成器方式,按行一次读取每条记录
temp=fin.readline()
def Match(key): #使用闭包 后面详细解释
checkAns=[i for i in readFile() if key in i]
if len(checkAns)>0:
for c in checkAns:
print (c.strip())
else:
print ('No Match')
return Match #闭包的使用 返回函数 闭包有点类似类里面的成员函数
def main():
print ('It is a test for python.')
fn=input('input file name:')
match=isMatch(fn)
if not match: #如果文件不存在 就退出 不执行后面操作
return -1
key=input('input your key string:')
while(key): #如果输入为空,退出循环
match(key)
key=input('input your key string:')
if __name__ == '__main__': #入口
main()
因为python的理念“优雅”,“明确”,“简单”,“There should be one-- and preferably only one --obvious way to do it.” 我开始接触python。我使用的是python3.4的编译环境。因为网上还有很多教程上的实例都是基于2.x版本的。我个人感觉,很多地方都改变了。我大概说说我的经验。
这段代码是我在听一个视频教程,那个讲师留的一个作业,然后自己编写的程序。大概的意思就是,读取数据源里面的数据,简单起见,我就采用了文本保存数据源,然后建立简单的查询,查询是否存在相关的记录。
这段代码其实就是2个事情,1:读取记录,2:检索
p1:文件打开,可以是这样的 [伪代码,分号分隔语句] f=open(fileName); while(!eof(f)):f.read();f.close();就是打开文件,在没读完文件之前,不停的读。但是根据“Only one way to do it” 对于文件这种打开后需要关闭的的“流”我采用 with.... as.... 语句。 如果你曾经用过VB,是否很眼熟。with.... as....结构的好处在于你不需要关心文件的关闭操作,在结束该语句块的作用域后,会自动帮你关闭文件。当然,你也可以在任何时候,添加close()语句,关闭文件。
p2:在读取记录的时候,采用了yield,制造了一个生成器。所谓生成器,其实就是一个迭代器,用来遍历。当然,一个做法是用readlines()读完整个文件,返回保存所有记录的一个列表。但是如果数据源文件很大,比如几十G之类,那就很可怕了。所以采用迭代器,使用的时候就可以遍历了。
p3:闭包。这段代码里面,Match和readfile这2个函数,是在isMatch函数内定义的。根据面向对象的概念,isMatch是父函数,Match和readfile是子函数。python里面,所有都是对象,包括函数本身,对象就有一个作用域。因为子函数在父函数内部定义,所以,子函数的作用域只仅限于父函数内部,同时,传递给父函数的变量,在父函数内部也是有效的,所以,所谓的闭包,就是子函数可以使用父函数的参数。
p4:再看这个闭包实例的作用,相当于实现了一个类的功能。比如实现isMatch函数的功能,可以建立一个类,比如 class IsMatch 其中,有一个私有成员,fname还有一个私有的成员函数readfile和公共成员函数match。传递给isMatch参数fname,相当于用fname构造函数的参数,实例化IsMatch类。闭包中的语句match=isMatch(fn)就相当于用fn实例化了IsMatch类。然后,isMatch函数最后返回的是Match函数,所以此时match就相当于isMatch闭包里面的Match函数,需要传递参数key。类似于使用IsMatch类中的公共函数Match。
p5:列表解析。搜索记录中是否包含有关键字的代码用了一句 checkAns=[i for i in readFile() if key in i] 返回一个列表。这个语句相当于
num=0
for line in readfile():
line=line.strip()
words=line.split('\t')
if words.count(key)>0:
print (line)
num+=1
if num==0:
print ('No Match')
python中列表的功能是很强大的。利用列表可以完成函数返回多个值,同时命名等。比如,给变量i,j分别赋值为1,2,可以这样写
i,j=1,2
很多时候,我们需要用swap函数,就是交换2个变量的值,python中可以直接交换,比如交换i和j的值,可以直接这样写
i,j=j,i
p6:就好象c++中的main函数一样,执行一段python代码,需要一个入口函数,python中的入口函数就是
if __name__ == '__main__': #入口
main()
以上是我的拙见,有不对的地方,恳请指教