python 脚本学习(一)

简介:

日志读取脚本

功能:用于读取某日志文件,可指定某个匹配条件,返回文本中匹配到的该行和前面的n行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
此脚本可以接受 3 个参数,分别是文件对象、搜索的关键词、返回匹配的该行前面的行数。
#!/usr/local/python27/bin/python2.7
import  sys
from  collections  import  deque
 
def  search(f,pattern,keep_num):
#定义一个队列,设置最大队列数,这个队列中的数据是可覆盖的,如果达到了最大队列数,则新加入的数据会覆盖前面的。
     pre_lines  =  deque(maxlen = keep_num)
     for  line  in  f:
         if  pattern  in  line:
             yield  line,pre_lines
#这里的逻辑就是将从文件对象f中读取的每一行做模式匹配的判断,如果不匹配则放入pre_lines队列中去,继续查找下一行,只保存最大能允许的行数,这个有参数maxlen控制,多出的数据则覆盖前面的,直到匹配到了需要的关键字,则返回一个生成器,生成器中包括了匹配到的行,以及该行之前的n行,也就是之前保存在pre_lines队列中的行。          
         pre_lines.append(line)
 
if  __name__  = =  '__main__' :
     log_file  =  sys.argv[ 1 ]
     pattern  =  sys.argv[ 2 ]
     keep_num  =  int (sys.argv[ 3 ])
     with  open (log_file) as f:
#这个循环就是从search函数返回的生成器中取数据,分别保存在变量中,再分别打印出来。    
         for  line,pre_lines  in  search(f,pattern,keep_num):
             for  pline  in  pre_lines:
                 print  pline
             print  line
             print  "-"  *  20


键值对处理脚本

处理一个key -> value的配置文件,key可能出现多次,对应相同或者不同的value,要求返回每个key对应的所有不重复的value。


这里先讲下collections模块的defaultdict 和 dict


这里的defaultdict(function_factory)构建的是一个类似dictionary的对象,其中keys的值,自行确定赋值,但是values的类型,是function_factory的类实例,而且具有默认值。比如default(int)则创建一个类似dictionary对象,里面任何的values都是int的实例,而且就算是一个不存在的key, d[key] 也有一个默认值,这个默认值是int()的默认值0.


笔者的理解:

defaultdict接受一个工厂函数作为参数,这个传入的工厂函数的类型,决定了该字典对象中keys的类型和值的类型。


比如 defaultdict(set)这里传入了一个set类型,这表示其中的keys为集合,要在key中加入数据则要使用集合的内置add方法,对应的value也会符合集合的特点,无序性,唯一性。


如果 defaultdict(list) 这里传入了一个list类型,这表示其中的keys为列表,要在key中加入数据则要使用列表的内置方法append,对应的value也会符合列表的特点,有序性,可重复。


处理如下文件:

key1=111

key2=222

key1=111

key1=123

key3=333

key4=111

key5=555

key6=666

key2=222

key7=777

key8=111


要实现返回每个key对应的所有不重复的value,这里要使用set类型。

代码实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
! / usr / local / python27 / bin / python2. 7
import  sys
from  collections  import  defaultdict
 
conf  =  defaultdict( set )
 
for  line  in  open (sys.argv[ 1 ]):
     k,v  =  line.split( '=' )
#由于传入的工厂函数为set,所以这里的key就是集合,要用集合的add方法插入值。
     conf[k.strip()].add(v.strip())   
 
for  k,v  in  conf.items():
     print  "%s => %s"  %  (k,v)

输出结果:

wKiom1XilAuQZAu0AAC9tahbXi0683.jpg

可以观察到文本中有多个重复的key1=111只输出了一次。


下面传入list类型做对比

wKiom1XildqAI66KAAEEIfC75aI494.jpg


输出结果:

wKioL1XimBawg5RWAADGd4vyXYI244.jpg


有一些任务,需要保存到字典中,key为名称,value为内容,但是在执行的时候,需要保持存储时的顺序。

方法(一)

使用字典保存数据,并附加一个list保存顺序

1
2
3
4
5
6
7
8
9
10
11
#!/usr/local/python27/bin/python2.7
import  sys
 
d1 = dict ()
l1 = []
for  line  in  open (sys.argv[ 1 ]):
     k,v  =  line.split( '=' )
     l1.append(k)
     d1[k]  =  v
 
print ( "%s => %s"  %  ( [ i  for  in  l1],[ d1[i]  for  in  l1 ]))


方法(二)

使用OrderedDict

1
2
3
4
5
6
7
8
9
10
11
#!/usr/local/python27/bin/python2.7
import  sys
from  collections  import  OrderedDict
 
od  =  OrderedDict()
for  line  in  open (sys.argv[ 1 ]):
     k,v  =  line.split( '=' )
     od[k.strip()]  =  v.strip()
 
for  k,v  in  od.items():
     print  k,v


一般字典dict()是无序的,但是OrderedDict是有序字典,会按照插入的顺序保存数据。


从一篇英文文章中统计出频率出现最高的10个单词

代码实例:

1
2
3
4
5
6
7
8
9
10
#!/usr/local/python27/bin/python2.7
import  sys
import  re
from  collections  import  Counter
 
with  open (sys.argv[ 1 ]) as f:
#匹配出所以单词,并且全部转换为小写,保存在一个列表中。
     words  =  re.findall(r "\w+" ,f.read().lower())
#Counter方法可以从一个列表中统计每个元素出现的次数,.most_common(n)用于筛选出出现次数最多n项;
     print  Counter(words).most_common( 10 )

输出结果:

./counter.py english_article.txt 

[('to', 16), ('his', 15), ('him', 12), ('in', 12), ('tyler', 9), ('she', 9), ('and', 9), ('that', 8), ('he', 8), ('i', 8)


使用命名元组分段处理一个csv的文件

文件样例:

name,gender,email,phone,sn

huairen,man,huai@adminblog.com,1899000001,17829

huairen,man,huai@adminblog.com,1899000001,17829

代码实例:

1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/local/python27/bin/python2.7
import  sys
import  csv
from  collections  import  namedtuple
 
l1 = []
with  open (sys.argv[ 1 ], 'rb' ) as f:
     reader  =  csv.reader(f)
     nametup  =  namedtuple( "tup" ,reader. next ())
     for  line  in  reader:
         l1.append(nametup( * line))
     print (l1)

命名元组的使用实例:

wKioL1XoTA-jphS9AADfRrnHEvM433.jpg

输出结果:

tup(name='huairen', gender='man', email='huai@adminblog.com', phone='1899000001', sn='17829')




本文转自qw87112 51CTO博客,原文链接:http://blog.51cto.com/tchuairen/1689877

相关文章
|
9天前
|
Python
python函数的参数学习
学习Python函数参数涉及五个方面:1) 位置参数按顺序传递,如`func(1, 2, 3)`;2) 关键字参数通过名称传值,如`func(a=1, b=2, c=3)`;3) 默认参数设定默认值,如`func(a, b, c=0)`;4) 可变参数用*和**接收任意数量的位置和关键字参数,如`func(1, 2, 3, a=4, b=5, c=6)`;5) 参数组合结合不同类型的参数,如`func(1, 2, 3, a=4, b=5, c=6)`。
13 1
|
12天前
|
Python
Python文件操作学习应用案例详解
【4月更文挑战第7天】Python文件操作包括打开、读取、写入和关闭文件。使用`open()`函数以指定模式(如'r'、'w'、'a'或'r+')打开文件,然后用`read()`读取全部内容,`readline()`逐行读取,`write()`写入字符串。最后,别忘了用`close()`关闭文件,确保资源释放。
17 1
|
4天前
|
Python
python学习3-选择结构、bool值、pass语句
python学习3-选择结构、bool值、pass语句
|
3天前
|
机器学习/深度学习 算法 Python
使用Python实现集成学习算法:Bagging与Boosting
使用Python实现集成学习算法:Bagging与Boosting
15 0
|
3天前
|
Python
python学习-函数模块,数据结构,字符串和列表(下)
python学习-函数模块,数据结构,字符串和列表
25 0
|
4天前
|
Python
python学习14-模块与包
python学习14-模块与包
|
4天前
|
Python
python学习12-类对象和实例对象
python学习12-类对象和实例对象
|
4天前
|
数据采集 Python
python学习9-字符串
python学习9-字符串
|
4天前
|
Python
python学习10-函数
python学习10-函数
|
4天前
|
存储 索引 Python
python学习7-元组
python学习7-元组