Python:脚本,比较两个文件,求A-B。
2012-07-18 16:42
399 查看
最近公司有一大堆的代号需要比较,已经分成了两个文件,求A-B的补集。shell命令可以用comm, diff, sort 甚至grep的参数。
精通这些命令需要很长的时间,而且感觉走了弯路。
比如说,使用sort命令,会自动对文件的行排序,所以结果也多了一个步骤,“排序”,再比如grep,是对文件中的一行匹配,如果遇到针对一行中的某个字段,则要放弃grep了,因为grep只是对行操作。
有使用shell命令解决这个问题的博客:简单的 LINUX Shell 下求集合交集差集的办法。
但是现在使用python,再加上一点点的算法则,则“一切都在掌握之中”。例如:
readlines会读取每行的内容(包括回车符 '\n'),然后把每一行的内容作为元素存入指定的列表中,虽然后面跟着回车符,但是不影响比较,所以就没有去掉,知道最后得到结果的时候才去掉回车符,然后把列表合并成一整块字符串。
其实这是最简单的比较,如果需要求一行中某个特殊的字段,则需要re正则表达式模块。
python用于运算结构简单,迅速,在有些方面是胜于shell脚本的。这里没有用到任何linux命令,但是完成linux命令组合才能做到的事情是这篇文章的亮点。而且随着要求的复杂,python的优势就会体现出来。
第二个例子:
两个文件:
log
516689024,516687533,516690910,516687940,516687510,516688203,517291285,516688195,516708331
log2
516706050 516708202 516706926 516688819 516708265 516687887 516686936
516687791 516690999 516689665 516687686 516689915 516690790 516687027
516691061 516689157 517290929 517292136 516688571 516687746 516689789
517291799 516687545 517291060 516688211 516707087 516687870 517290886
516705798 516691043 516705690 516688109 516688547 516687596 516688927
516687994 516687476 516687892 516688731 516687314 516689902 516687350
516688822 516689164 516688195 516687798 516687690 516687510 516687824
516688789 516686991 516687940 516691092 516687533 516689024 517291285
516690910 516708405 516687615 516689438 516688203 516708331
两个文件的内容完全不同,唯一共同点是所有的数字都是9位数字.这次使用集合的方法求log2中log的补集。代码如下:
精通这些命令需要很长的时间,而且感觉走了弯路。
比如说,使用sort命令,会自动对文件的行排序,所以结果也多了一个步骤,“排序”,再比如grep,是对文件中的一行匹配,如果遇到针对一行中的某个字段,则要放弃grep了,因为grep只是对行操作。
有使用shell命令解决这个问题的博客:简单的 LINUX Shell 下求集合交集差集的办法。
但是现在使用python,再加上一点点的算法则,则“一切都在掌握之中”。例如:
#!/usr/bin/env python # read lines from mids.txt import sys f1, f2=None,None try: f1=open("mids.txt", "r") m=f1.readlines() except IOError: print "mids.txt does not exist!" sys.exit(2) finally: if f1: f1.close() # reead lines from mids2.txt try: f2=open("mids2.txt", "r") n=f2.readlines() except IOError: print "mids2.txt does not exist!" sys.exit(2) finally: if f2: f2.close() #filter for a in m: for b in n: if a==b: n.remove(b) for i in range(len(n)): n[i]=n[i].strip() print " ".join(n)
readlines会读取每行的内容(包括回车符 '\n'),然后把每一行的内容作为元素存入指定的列表中,虽然后面跟着回车符,但是不影响比较,所以就没有去掉,知道最后得到结果的时候才去掉回车符,然后把列表合并成一整块字符串。
其实这是最简单的比较,如果需要求一行中某个特殊的字段,则需要re正则表达式模块。
python用于运算结构简单,迅速,在有些方面是胜于shell脚本的。这里没有用到任何linux命令,但是完成linux命令组合才能做到的事情是这篇文章的亮点。而且随着要求的复杂,python的优势就会体现出来。
第二个例子:
两个文件:
log
516689024,516687533,516690910,516687940,516687510,516688203,517291285,516688195,516708331
log2
516706050 516708202 516706926 516688819 516708265 516687887 516686936
516687791 516690999 516689665 516687686 516689915 516690790 516687027
516691061 516689157 517290929 517292136 516688571 516687746 516689789
517291799 516687545 517291060 516688211 516707087 516687870 517290886
516705798 516691043 516705690 516688109 516688547 516687596 516688927
516687994 516687476 516687892 516688731 516687314 516689902 516687350
516688822 516689164 516688195 516687798 516687690 516687510 516687824
516688789 516686991 516687940 516691092 516687533 516689024 517291285
516690910 516708405 516687615 516689438 516688203 516708331
两个文件的内容完全不同,唯一共同点是所有的数字都是9位数字.这次使用集合的方法求log2中log的补集。代码如下:
#!/usr/bin/env python "File: filtermids.py -- " import re def main(): # read mids from the file log = open("log", "r") log2 = open("log2", "r") m = [] n = [] x=re.compile("\d{9}") for line in log: m = m + x.findall(line.strip()) for line in log2: n = n + x.findall(line.strip()) log.close() log2.close() # 或者使用 print " ".join(set(n)-set(m)) for a in list(set(n)-set(m)): print a, if __name__ == '__main__': main()
相关文章推荐
- 使用Python的MD5算法比较两个文件
- BASH命令和SHELL脚本总结(11)比较两个文件创建时间的先后
- 使用Python的MD5算法比较两个文件
- perl脚本比较两个文件的相同行和不同行
- python中比较两个文件是否相同
- 使用python比较两个文件的不同之处
- 一个用于比较两个文件行中不同的Perl脚本
- 一个简单比较oracle两个用户下表数据差异的python脚本
- python脚本,筛出两个文件中重复的行
- python比较用户输入的两个文件,如果不同,显示所有不同的行号
- python比较两个文件的差异
- shell脚本——比较两个文件大小、权限
- python比较两个文件的差异
- Python比较两个文件(txt,csv等)相同内容合并同一文件/文本时间大小比较大小
- [置顶] 通过python利用哈希值实现比较两个文件的一致性
- 两个使用Python脚本操作文件的小示例分享
- 两个使用Python脚本操作文件的小示例分享
- Python小脚本:计算两个文件内容的相似率
- 用python比较两个文件中内容的不同之处, 并输出行号和内容.
- 使用Python的MD5模块比较两个文件是否一致