1.fileinput模块
函数介绍
1.input([files[,inplace[,backup]])
这是最重要的一个函数,便于遍历多个输入流中的行 你能将inplace参数设置为真值进行原地处理,再进行原地处理的时候可选的backup参数将文件名扩展备份到通过原始文件创建的备份文件中
例子:写一个脚本实现把test1.txt文件中的Python替换
#!/usr/bin/python
import fileinput
for line in fileinput.input('test1.txt',backup='_bak',inplace=1):
print line.replace('Python','LinuxEye'),
fileinput.close()
~
test1.txt文件
执行脚本后生成 test1.txt 和 test1.txt_bak
2.filename() 返回当前文件名称 lineno()返回当前文件的行数 isfirstline() 检查时候当前行是第一行
例子:写一个为python脚本添加行号的脚本
#!/usr/bin/python
import fileinput
for line in fileinput.input(inplace=True):
line = line.rstrip()
num = fileinput.lineno()
print '%-40s # %2i' % (line,num)
执行 python numberlines.py numberlines.py
显示结果
3.nextfile() 关闭当前文件移动到下一个文件 close() 关闭序列
2.数据结构模块 集合set,堆heap,双端队列deque
(1)set
(1)set是由序列或者其它可迭代对戏构建的。它们主要用于检查成员资格,因此副本是被忽略的,即不存在重复的元素
(2)集合的元素顺序任意
(3)常用函数有 union:求集合并集 issuperset intersection difference & <= >= 具体意思看例子:
堆是优先队列的一种,使用优先队列能以任意顺序增加对戏,并且能够在任何时间找到最小元素
heap的基本操作函数:
heappush(heap,x),heappop(heap), 入堆,及最小元素出堆操作
heapify(heap), 将heap属性强制应用到任意一个列表
heapreplace(heap,x) 将最小元素弹出,同时将x入堆
注意堆中元素并不是严格排序的,但是它满足如下规则:位于i 位置上的元素总大于位于位置i/2的元素
3)deque
deque是数据结构中的双端队列
双端队列能够有效地在左侧增加和弹出元素,这是列表无法实现的,除此之外,它还能有效地旋转(rotate)元素(将它们左移或右移,使得头尾相连)
3.random模块
random模块包括返回随机数的函数,但注意事实上它产生的数字都是伪随机数,如果需要真的随机性,应该使用os模块的urandom函数
常用函数有:
uniform(a,b) 返回随机实数n 在[a,b)区间 randrange([start],stop,[step]): 返回range(start,stop,step)中的随机数
random.choice(seq): 从序列中返回随机元素random.shuffle将给定的序列元素进行随机移位 random.sample从给定序列序列中均一地选择给定数目的元素,同时确保元素互不相同
4.shelve模块
shelve模块提供一个简单的将数据存储到文件中的方法,它有一个open函数,在调用它的时候(使用文件名作为参数),它会返回一个shelf对象,你可以用它来存储内容,只需要把它当做普通的字典(但键一定要作为字符串)来操作即可。在完成工作(并将内容存储待磁盘之后,调用它的close方法。
下面是一个简单的使用shelve模块实现的数据库应用程序:
import sys,shelve
def store_person(db):
pid = raw_input('Enter unique ID number: ')
person = {}
person['name'] = raw_input('Enter name: ')
person['age'] = raw_input('Enter age : ')
person['phone'] = raw_input('Enter phone number: ')
db[pid] = person
def lookup_person(db):
pid = raw_input('Enter ID number: ')
field = raw_input('What would you like to know?(name,age,phone) ')
field = field.strip().lower()
print field.capitalize() + ':', db[pid][field]
def print_help():
print 'The available commands are:'
print 'store:Stores information about a person'
print 'lookup: Look ip a person from ID number'
print 'quit : save changes and exit'
print '?:Print this message'
def enter_command():
cmd = raw_input('Enter command (?for help): ')
cmd = cmd.strip().lower()
return cmd
def main():
database = shelve.open('/home/chenwu/databse.dat')
try:
while True:
cmd = enter_command()
if cmd == 'store':
store_person(database)
elif cmd == 'lookup':
lookup_person(database)
elif cmd == '?':
print_help()
elif cmd == 'quit':
return
finally:
database.close()
if __name__=='__main__': main()
运行结果
先输存入若干信息,然后就可以查看
5.re模块
re模块包含一些很有用的操作正则表达式的函数
re.compile将正则表达式(以字符串书写的)转换为模式对象,可以实现更有效率的匹配。通常与search,match等函数结合使用,在调用这些函数时如果使用字符串表示的正则表达式,它们也会在内部将字符串表示为正则表达式对象
re.search会在给定字符串中寻找第一个匹配给定正则表达式的子串,re.match会在给定字符串的开头匹配正则表达式。
re.split会根据模式的匹配项来分割字符串,它允许用任意长度的逗号和空格序列来分割字符串,它有一个maxsplit参数,表示字符串最多可以分割的次数
re.findall以列表的形式返回给定模式的所有匹配项
上面的例子首先返回句子中匹配英文单词的列表,然后返回句子中匹配标点符号的列表
re.sub函数 可以使用给定的替换内容将匹配模式的子字符串替换掉
假设要把类似‘*something*'的字符串用'<em>something</em>替换:
首先建立模式对象,这个模式对象表示第一个字符和最后一个字符都是* 中间是除了*的任意若干字符
从上述例子可以看到,普通文本已经成功转换成HTML
下面用re模块实现一个简单的模板系统
它的功能是可以自动翻译[]中的字符串,实现运算到过程到结果的翻译,和赋值语句的翻译
例如 [7+9]可以翻为16
'[name = "Mr.Gumby:]Hello,[name]'翻译为'Hello,Mr.Gumby'
脚本templates.py代码如下:
#templates.py
#coding:utf-8
import fileinput,re
#匹配中括号里的字段
field_pat = re.compile(r'\[(.+?)\]')
#将变量收集到这里
scope = { }
#用于re.sub中
def replacement(match):
code = match.group(1)
try:
#如果字段可以求值, 用eval函数求值
return str(eval(code,scope))
except SyntaxError:
#否则执行相同作用域内的赋值语句。用exec 实现赋值语句的翻译
exec code in scope
return ' '
#将所有文本以一个字符串的形式获取
lines = []
for line in fileinput.input():
lines.append(line)
text = ' '.join(lines)
#将field 模式的所有匹配项都替换掉
print field_pat.sub(replacement,text)
键一个test.txt 内容如下:
执行