从Excel文件中找出在TXT文件中没有出现的 行之_代码片段

 

#从data.txt(Excel文件)中找出一些不在target.txt(TXT文件)文件行中出现的行。

#定义一个函数,判断ls中的每个单词是否出现在了mystring中了。如果全部都在,返回真

def listContain(ls, mystring):
    for s in ls:                    #取出ls中的每个单词
        if s not in mystring:
            return False            #如果ls中只要有一个单词不在mystring行,返回错误,函数运行结束
            #如果s在mystring里面,继续进行下一轮for循环,也就是测试下一个单词是否存在mystring中,确认所有单词都出现在mystring里,返回true
        #else:
            #return True            #return语句用来从一个函数 返回 即跳出函数。我们也可选从函数 返回一个值 
    return True                     #如果ls中每个单词都出现在了mystring中,相当于for循环没有执行,该函数返回真
#return 这里不能修改下吗?逻辑如何运转的。如果返回了一个False,后面的return就不用运行了吗?
#return运转如下:如果ls中有个单词都没有出现在mystring中,就返回错误,程序就结束了(不会执行最后返回真的语句),
#如果ls一个单词出现在mystring句子中,继续通过for循环判断下一个单词是否出现在mystring中,如果所有单词都出现在mystring中,
#,for循环执行完毕,程序返回True
file1 = 'data.txt'
file2 = 'target.txt'
file_output = 'results.txt'       #output file name
file_output_less = 'results_less.txt'

lines1 = open(file1).readlines()
lines2 = open(file2).readlines()
if lines1 and lines2:
    for line1 in lines1:
        l1 = line1.replace('"', '').split()         #删除每行的引号,然后切片变成列表
        for line2 in lines2:                  #对列表中的每个元素进行处理,对目标文档进行每行搜索,看看l1是否存在其中的任何一行中
            if listContain(l1, line2):#如果为真,也就是l1中所有单词都出现在line2里了,然后退出if,for循环,进入for循环,调出下一个l1句子
            	#问题1:如果为假,就应该输出该line1行到文件,不用犹豫;如果为假,程序如何进行
                break                           #问题4:这种情况什么都不做,退出循环,程序去了哪里?退出if循环还是for循环
                #Python break语句,就像在C语言中,打破了最小封闭for或while循环.如果您使用嵌套循环,break语句将停止执行最深层的循环,并开始执行下一行代码

            #else:
                #open(file_output, 'a').write(line1) #这样写会导致同一个line1对多个line2进行判断,我们只要判断line1没有出现,
                #就输出line1,然后直接判断下一个line1,而不是看同一个line1是否出现在lines2的其他行,导致同一个line1重复多次输出
        else:                                   #问题2:else是对应哪个if,删除前面的if后,对结果没有影响啊,删除else,报缩进错误
    	    open(file_output,'a').write(line1)  #if为假,说明l1中有一个单词没有出现在line2中,就把该行写进文件里
            #当l1通过for循环对lines2的每一场进行确定,l1确实不在lines2里面,自动会运行到else语句,这个else和for line2配套的,和C语法有点区别
            #写入文件后,应该进行下一个line1的判断了,不用判断lines2里面的东西
            #说明以前对行进行的各种处理都是临时的
            #break                              #问题5:我添加break让程序自动跳到下一行line1为啥不行?程序提示open缩进有问题

lines3 = open(file_output).readlines()
for line3 in lines3:
    if 'n.a.' not in line3:
        open(file_output_less,'a').write(line3) 
 
 
##############################################分割线#################################################
'''
for line1 in lines1:                        #逐行取出lines1内容
    l1 = line1.replace('"', '').split()         #对line1进行切片处理
    for line2 in lines2:                  
        if listContain(l1, line2):                #如果line1包含在task文件的某一行,立刻退出,判断下一行line1
            break                                   
    else:                                           #如果line1不在lines2的所有行里,就执行else语句,把该line1语句添加进文件里
        open(file_output,'a').write(line1) 
关键代码分析:


'''
################################################分割线####################
'''
else的描述,
不只是if有,while和for都有else分支。循环体的else分支触发条件是循环正常结束。如果循环内被break跳出,就不执行break后紧跟的else。
所以这个逻辑是:如果循环内break了,
不触发else,则执行下一句外层循环中的break;如果正常结束,执行else分支里的continue,直接跳转到外层循环的下一轮,跳过了第二个break。
for和while的else子句用于循环后处理,仅在循环正常结束时执行。

问题中所举的例子,设置一个flag变量,代码看起来会更直观一些。

难说哪种写法好,我倒挺喜欢用else分支的。

作者:Coldwings
链接:https://www.zhihu.com/question/37076998/answer/70307714
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

for … else结构下
1.for里面的语句和普通的(没有else的for语句)没有区别;
2.else中的语句会在循环正常执行完后执行;
3.当for中语句通过break跳出而中断时,不会执行else。

最后总结一句,for ... else结构一般要和break一起使用,才能体现这个结构的强大之处(至少我是这么觉得的,不知还有什么其他情况,希望网友不吝赐教)。

while ... else结构也符合上述条件。

'''










https://www.zhihu.com/question/37076998/answer/70307714
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

for … else结构下
1.for里面的语句和普通的(没有else的for语句)没有区别;
2.else中的语句会在循环正常执行完后执行;
3.当for中语句通过break跳出而中断时,不会执行else。

最后总结一句,for ... else结构一般要和break一起使用,才能体现这个结构的强大之处(至少我是这么觉得的,不知还有什么其他情况,希望网友不吝赐教)。

while ... else结构也符合上述条件。

'''










 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值