以下是自己写的几个对文件操作的小程序,里面涉及到文件操作,列表(集合,字典)的运用等。比方说,从文件里读取一行数据。分别存放于列表中,再对列表进行操作。如去掉里面的反复项。排序等操作。
常见对文件里行进行操作:
#这里列出两个经常使用的方法
- 方法01: 一次性读取全部行
>>> f = file('1.txt') >>> while 1: lines = f.readlines() if not lines: break for line in lines: print line
- 方法02: 一行行读取
>>> f = file('1.txt') >>> while f: line = f.readline() if len(line) == 0: break else: print line,
常见对列表去反复项操作:
- 方法01: 函数处理
#列表中值超过1者表示有反复则删除,比方:
#列表顺序==>改变
>>> list1.count(3) #元素值为3的个数:2个 2 >>> def removeDup(lst): for x in lst: if lst.count(x)>1: del lst[lst.index(x)] >>> lst = [1,3,2,4,3] >>> removeDup(lst) >>> lst [1, 2, 4, 3]
- 方法02: 常规方法
#建新空列表,遍历原始列表。假设不在新空列表中,则加入
#列表顺序==>不变
>>> list1 = [1,3,2,4,3] >>> list2 = [] >>> for i in list1: if i not in list2: list2.append(i) >>> list2 [1, 3, 2, 4]
- 方法03: 字典方法
#利用字典key值的唯一性,及里面的fromkeys()及keys()方法
>>> list1 = [1,3,2,4,3] >>> list2 = {}.fromkeys(list1).keys() >>> list2 [1, 2, 3, 4]
- 方法04: 集合方法
#集合能去除列表中反复项
#列表顺序==>改变
>>> list1 = [1,3,2,4,3] >>> set(list1) set([1, 2, 3, 4])
- 方法05: 迭代工具
#用itertools的迭代工具的groupby()方法
#列表顺序==>改变
>>> import itertools >>> lst = [1, 3, 2, 4, 3] >>> lst.sort() >>> it = itertools.groupby(lst) >>> for k,g in it: print k 1 2 3 4
- 方法06: 索引排序
#先用集合,再用排序,注意key=list1.index。控制顺序
#列表顺序==>改变
>>> list1 = [1,3,2,4,3] >>> list2 = list(set(list1)) >>> list2.sort(key=list1.index) >>> list2 [1, 3, 2, 4]
常见对字符串反转操作:
- 方法01: 列表切片
>>> s = 'Hello' >>> l = list(s) >>> l[::-1] ['o', 'l', 'l', 'e', 'H']
- 方法02: 常规做法
>>> def rev(s): str0 = '' l = len(s)-1 while l >=0: str0 += s[l] l -= 1 return str0 >>> s = 'A B C D' >>> rev(s) 'D C B A'
- 方法03: 列表反转
>>> s = 'HELLO' >>> l = list(s) >>> l.reverse() #列表reverse()方法 >>> ''.join(l) #用空字符串join列表 'OLLEH'
- 方法04: reduce函数
>>> def rev(s): return reduce(lambda x,y: y+x, s) #匿名函数和reduce函数结合使用 >>> s = 'AB CD' >>> rev(s) 'DC BA'小程序一: 提取两个文件里同样部分
f1 = open("1.txt","r+") f2 = open("2.txt","r+") f3 = open("3.txt","w+") all1 = f1.readlines() #先拿文件1中全部行取出 all2 = f2.readlines() #再拿文件2中全部行取出 f1.close() f2.close() for l1 in all1: for l2 in all2: if l1.strip()==l2.strip(): #比較行中内容是否一样 f3.write(l2) else: continue else: pass print "#"*40 f3.close()小程序二: 反向读取文件
假如要读取的test.txt文件内容例如以下:
Python
Perl
Java
Shell
file1 = file('test.txt','r') #打开文件句柄 list1 = [] #用一个空列表用于存放每行的内容 while True: line = file1.readline() #按行读取 list1.append(line.strip()) #去除字符串空格 if len(line) == 0: #假设没内容,则中断 break for l in list1[::-1]: #反向遍历。然后依次读取出来 print l file1.close()输出结果:
Shell
Java
Perl
Python
小程序三: 对两个文本文件进行操作
要求:
1. 移除每一个文件里的反复项
2. 找出两个文件里的同样项
3. 操作两个文件里的合集
4. 操作两个文件里的交集
#原始文件:文件1,文件2 f1 = file('1.txt','r') f2 = file('2.txt','r') #生成文件:文件3,文件4,文件5,文件6 f3 = file('same.txt','w+') f4 = file('union.txt','w+') f5 = file('1_diff.txt','w+') f6 = file('2_diff.txt','w+') #用空列表来存储原始文件的内容 list1 = [] #用一个空列表用于存放每行的内容 list2 = [] #用于存放文件2中的内容 1_diff = [] #用于存放文件1中的去重部分 2_diff = [] #用于存放文件2中的去重部分 #遍历两个文件 while True: line1 = f1.readline() line2 = f2.readline() if len(line1) ==0 or len(line2)==0: break else: list1.append(line1) list2.append(line2) list1_uniq = set(list1) #排除第一个文件里反复的内容 list2_uniq = set(list2) #注意应用集合排除反复的项目 same = list1_uniq & list2_uniq #取交集 union = list1_uniq | list2_uniq #取合集 #取两个集合的交集。写入文件3中 for i in same: f3.write(i) #取两个集合的并集,写入文件4中 for i in union: f4.write(i) #取列表1中部分,与共同部分取交集 for i in list1_uniq: if not i in same: f5.write(i) #取列表2中部分,与共同部分取交集 for i in list2_uniq: if not i in same: f6.write(i) #关闭全部打开的文件句柄 f1.close() f2.close() f3.close() f4.close() f5.close() f6.close()
NOTE:也能够用X-Y来求两个集合的差集
>>> X = set('spam')
>>> Y = set(['h','a','m'])
>>> X,Y
(set(['a', 'p', 's', 'm']), set(['a', 'h', 'm']))
>>> X - Y
set(['p', 's'])