又是好久没有发技术上的文章了,一方面是最近工作也比较忙,同时自己也在学习python,另外一方面是因为个人不喜欢发表一些在互联网上可以直接找到的技术文章,最起码也得加上自己的一些思考和研究才算罢了吧!
虽然python或者说集合这个东西很基础甚至很简单,但我还是想在这里白话白话自己的一个过程。
集合这个东西最早我是在数学里听到的,集合之间可以做一些运算,比如求交集,并集,归属等等。而集合在数学中算是一种散列的数据结构,通俗点来说就是无序的。既然集合是无序的,并且可以做一些集合运算,那这样其实就有很大的用途了,比如说可以比较两个集合的差异,求差集,交集,并集(其实跟没说一样,这不就是集合本身的特性么)。其实我想说的是,我们可以再抽象下,比如说,把一个文件看做集合,文件的内容看做集合的元素,那这样就可以对文件进行做简单的运算了,就可以很清楚的对比两个文件的差异了。
接下来就讲一下使用python的set集合的属性来对比文件差异,效果如下:
sh-4.1# mydiff
Please input two argvs. Example:mydiff file1 file2
sh-4.1# mydiff abc1 abc2
abc1 abc2共同拥有部分:
######################################################
Hello,My name is Andy_xu!
abc1 :特有内容
######################################################
My web_site is what?
######################################################
abc2 :特有内容
######################################################
My web_site is http://my.oschina.net/xxbAndy/blog
######################################################
执行脚本,加需要对比的两个文件名称作为参数就可以得到文件的相同部分和不同部分了。懂linux的人都知道diff工具也可以对比文件的差异,但其实还是有差异的,另外我只是针对python中的set实践一下想法,请不要耻笑我。。。。
源码部分(代码比较粗糙,不喜勿喷啊):
#!/usr/bin/env python3
#-*- coding: utf-8 -*-
#Author-by:Andy-xu
#Contact:[QQ:371990778]
#Date:2016-07-06 16:03
#Update: 2016-08-17 23:15
#Description:利用set的特性对两个文件进行差异化对比
import sys
argvs = sys.argv
#构造两个文件集合类
class Set_file(object):
def __init__(self,file1,file2):
self.file1 = file1
self.file2 = file2
def Set_A(self):
A = set()
for file in open(self.file1).readlines():
A.add(file.strip())
return A
def Set_B(self):
B = set()
for file in open(self.file2).readlines():
B.add(file.strip())
return B
#集合运算
def Diff_Set():
try:
Set = Set_file(argvs[1],argvs[2])
Intersections = Set.Set_A() & Set.Set_B() #求交集,提取文件相同内容
print argvs[1]+" "+argvs[2]+"共同拥有部分:"
print("######################################################")
for intersection in Intersections:
print intersection
print("\n\n\n")
Diff_SetA = Set.Set_A() - Set.Set_B() #求差集,提取file1特有内容
print(argvs[1]+" :特有内容")
print("######################################################")
if len(Diff_SetA) == 0:
print("No difference!")
for diff_set in Diff_SetA:
print(diff_set)
Diff_SetB = Set.Set_B() - Set.Set_A() #求差集,提取file2特有内容
print("######################################################")
print("\n\n")
print(argvs[2]+" :特有内容")
print("######################################################")
if len(Diff_SetB) == 0:
print("No difference!")
for diff_set in Diff_SetB:
print(diff_set)
print("######################################################")
except Exception,e: #捕获异常,并给与友好提示
print("Please input two argvs for the mydiff. Example:"+argvs[0]+" file1 file2 ")
if __name__ == '__main__':
Diff_Set()
思考:首先,从集合运算的角度考虑,set本身是支持一些方法来进行集合运算的,比如:
#交集
#print list(set(a).intersection(set(b)))
#并集
#print list(set(a).union(set(b)))
#b有a无
#print list(set(b).difference(set(a)))
其次,源码部分在求差集那块完全可以使用类来封装。综合来说,代码的行数还是可以再减少点滴!
关于python set的思考目前就到这里,然而关于python,我还在继续,有想法会继续和大家分享,也希望成长之路有人一起交流。
有想法的Opser!
微信扫一扫
关注该公众号